Rosmin--OpenCV Color Blob Tracker on Android

Posted sununs11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rosmin--OpenCV Color Blob Tracker on Android相关的知识,希望对你有一定的参考价值。

我们用android版本的OpenCV来做颜色团块追踪(Color Blob Tracker),首先最关键的当然是Android上的OpenCV。Android+OpenCV开发环境搭建不多说,参考官网文档:http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/android_dev_intro.htmlhttp://docs.opencv.org/doc/tutorials/introduction/android_binary_package/O4A_SDK.html

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.舵机跟踪控制
二自由度舵机云台要根据团块的位置来移动,一开始我们想到的方法是把平面分成几个区域,团块坐标在不同的区域对应舵机的不同角度。但是后来发现效果不好,于是采取更直接的办法,比如团块在左边舵机就向左转,团块在上边舵机就向上转。遇到的问题是,检测速度不够导致舵机连续向某个方向转,视野里就没有团块了。如果把舵机调得太慢的话效果也不好,看得很纠结。
然后我问了一下CSK大神,他用MK802做了一个类似的东西,说是要根据团块偏离中心位置的距离调整舵机的运动速度。于是我开窍了。。。
// 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;
        

以上是关于Rosmin--OpenCV Color Blob Tracker on Android的主要内容,如果未能解决你的问题,请参考以下文章

给出一个图 G 找到该图中的所有节点块,使得 node.color 属性 = 特定颜色

some OpenGL constants

术语-BLOB:BLOB

OpenMV的单颜色识别讲解

Azure - get_blob_client - blob 创建

将 blob 从私有 blob 容器复制到 Azure 中的公共 blob 容器