OpenCV / EMGU(C#)检测对象

时间:2015-06-04 18:24:37

标签: c# opencv emgucv

我试图为拾取和放置机器编写一些图像检测代码。我是OpenCV的新手并且已经经历了很多例子 - 但仍然有两个悬而未决的问题。第一个我认为我有一个解决方案,但我在第二个丢失了。

我试图检测零件底部的偏移和角度。基本上,物体离十字架有多远(只是框架中心的一个指示器),以及该部件相对于部件中心的旋转角度。我使用过滤器来显示组件的打击垫。

bottom pads of surface mount part

我非常确定我希望实现类似http://felix.abecassis.me/2011/10/opencv-bounding-box-skew-angle/之类的内容 - 但我不确定如何将代码转换为C#(http://www.emgu.com/wiki/index.php/Main_Page)。任何指针都会有所帮助。

一个问题是如果部件小于握住它的针头,你可以看到部件和针头。

0402 resistor and needle

方形位是我想要检测的部分。圆形部分是针仍然暴露的一部分。我不知道如何处理这个问题 - 我正在考虑检测直线并丢弃弯曲线以产生形状。同样,我对中心偏移和旋转角度感兴趣。

1 个答案:

答案 0 :(得分:0)

首先,您应该使用findContours检测每个对象。然后,您可以在每个找到的轮廓上使用minimum area rectangle function。我假设你知道十字架的大小和坐标,这样你就可以使用MCvBox2D的中心坐标来获得它的偏移量。此外,您可以阅读框的角度属性,以便它符合您的目的。

对于第二部分,我会尝试拟合最小二乘的反角。圆形部分与方形部分相比似乎非常小,所以可能会起作用。

也许AForge图书馆中的Detection of Quadrilaterlas也可以为您提供帮助。

编辑: 要合并你的轮廓,我会尝试这样的事情:

 Rectangle merged = New Rectangle(New Point(img.Width, img.Height), New Size(0, 0)); //img is your binarized image
 Contour<Point> Pad_contours= img.FindContours(CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,CvEnum.RETR_TYPE.CV_RETR_LIST);
   while(Pad_contours !=null)
   {

     if(Pad_contours.Area <Pad_Area_max &&Pad_contours>Pad_Area_min)//Filter Pads to avoid false positive Contours
     {
     //Merge Pad contours into a single rectangle
         if(merged.Height >0)
         merged.Bottom=Math.Max(merged.Bottom,Pad_Contours.BoundingRectangle.Bottom);
         else
         merged.Height = contours.BoundingRectangle.Height;

         merged.Top=Math.Min(merged.Top,Pad_Contours.BoundingRectangle.Top);
         merged.Left=math.Min(merged.Left,Pad_Contours.BoundingRectangle.Left);

         if(merged.Width>0)
         merged.Right=Max(merged.Right,pad_Contours.BoundingRectangle.Right);
         else
         merged.Width=Pad_Contours.BoundingRectangle.Width;
     }
     //get next Pad
         If(Pad_contours.VNext==null)
         Pad_contours=Pad_contours.HNext;
         else
         Pad_contours = Pad_contours.VNext;
  }

矩形“merged”现在应该包含你所有的Pads。问题是你不会以这种方式获得角度,因为矩形总是垂直90°。为了解决这个问题,我将迭代如上所示的轮廓,并将每个轮廓的每个点存储在一个额外的数据容器中。然后我将使用上面提到的最小区域矩形函数并将其应用于所有聚集点。这应该为您提供一个带有角度属性的边界矩形。