Thanks for sharing! In other words: "follow the center of the biggest green thing" :) I love OpenCV!
On Tue, Feb 11, 2014 at 10:29 PM, Al B <[email protected]> wrote: > Thanks! > > You are correct. I'm just using a PD and tweaking the derivative term a > bit with the goal to eliminate the phenomenon known as "Derivative Kick". > With a simple proportional control I wasn't able to move the servos smooth, > you could notice the overshooting and jumping. > > The tracking algorithm is very simple. I just made the IOIO activity > implement CvCameraViewListener2 and implemented the onCameraFrame method as > shown below. I also extended the OpenCV CameraBridgeViewBase class (pretty > much cloned of the JavaCameraView class with some minor changes) since it > gives you better control than the one from the Android API. > > Also notice that the onCameraFrame method is called in a separate thread > created by the OpenCV API; which is a great since allows me to call the PD > controller code separately in the IOIO thread (i.e. the loop method) > between frames and update the servos every time the object position changes. > > public Mat onCameraFrame(CvCameraViewFrame inputFrame) { > rgbaImage = inputFrame.rgba(); > currentMaxArea = 7; > double s; > Imgproc.cvtColor(rgbaImage, mHsvMat, Imgproc.COLOR_RGB2HSV_FULL); > Core.inRange(mHsvMat, new Scalar(60, 100, 30), new Scalar(130, 255, > 255), mProcessedMat); // Green object > Imgproc.dilate(mProcessedMat, mDilatedMat, new Mat()); > final List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); > Imgproc.findContours(mDilatedMat, contours, new Mat(), > Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); > MatOfPoint2f points = new MatOfPoint2f(); > for (int i = 0, n = contours.size(); i < n; i++) { > s = Imgproc.contourArea(contours.get(i)); > if (s > currentMaxArea) { > currentMaxArea = s; > contours.get(i).convertTo(points, CvType.CV_32FC2); > } > } > if (!points.empty() && currentMaxArea > minArea) { > Imgproc.minEnclosingCircle(points, currentCenterPoint, null); > Core.circle(rgbaImage, currentCenterPoint, 3, new Scalar(255, 0, > 0), Core.FILLED); > } > > contours.clear(); > > return rgbaImage; > } > > > > -- > You received this message because you are subscribed to the Google Groups > "ioio-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/ioio-users. > For more options, visit https://groups.google.com/groups/opt_out. > -- You received this message because you are subscribed to the Google Groups "ioio-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/ioio-users. For more options, visit https://groups.google.com/groups/opt_out.
