1. OpenCV4Android Samples在你下载的OpenCV-x.x.x-android-sdk.zip中,有一些示例程序,比如摄像头采集图像,常用的图像处理,人脸检测,包括一个“color-blob-detection”,这些程序我并没有全都成功运行,不过经过一番折腾,color-blob-detection是成功了。它的主要作用就是检测出团块(blob),点一下某个区域,就会确定一种颜色,检测这种颜色的团块,然后界面上会显示一圈红色的轮廓。于是我把它改造了一下,先找出其中最大的一个轮廓,然后利用轮廓矩计算出团块的重心位置。
2. 轮廓矩一个轮廓对应一系列的点,也就是一条曲线。把图像经过一些处理,得到一个膨胀处理的二值图像,然后用findContours函数寻找到轮廓。接下来就是处理轮廓了。比较两个轮廓最简单的方式是比较轮廓矩,矩是对轮廓上的点做一些运算得到的一个特征,在这里我们只关心它如何得到中心位置。X = M10/M00,Y = M01/M00.就这么简单。
Moments mMoments = Imgproc.moments(iContour); double x = mMoments.get_m10()/mMoments.get_m00(); double y = mMoments.get_m01()/mMoments.get_m00(); Point center = new Point(x,y); distance = Math.sqrt( (x-360)*(x-360) + (y-240)*(y-240) ); // 720x480 image Core.circle(rgbaImage,center,3,new Scalar(0,255,0),3,8,0);3.舵机跟踪控制
// ColorBlobDetector.java中 if (PixelX > 288 && PixelX < 432 ) angleH = 0; else if (PixelX <= 288) angleH = 1; else if (PixelX >= 432) angleH = -1; if (PixelY > 192 && PixelY < 288 ) angleV = 0; else if (PixelY <= 192) angleV = 1; else if (PixelY >= 288) angleV = -1; // ColorTrack.java中 Thread tColorControl = new Thread(new Runnable(){ public void run(){ try{ int deltaT = 100; while(true){ deltaT = (int) (ColorBlobDetector.distance/433*110 + 30); Thread.sleep(deltaT); Handler01.post(rImageControl); } }catch(Throwable t){ } } }); tColorControl.start();
通过Handler post的延时来调整舵机运动的速度,另外降低图像的分辨率也让检测的速度提高了很多,这样达到的效果还算不错。
4. 团块面积
用Imgproc.contourArea(contour)函数计算出contour包含的面积,在寻找目标时可以设置一个阈值,目标面积大于这个值就可以认为到达了目标。如:
if (ColorBlobDetectionView.contourFlag && ColorBlobDetector.maxArea > 5000) { ControlPanel.basicControl("stop"); foundFlag = true; }