OpenCV/EMGU (C#) 物体检测

Posted

技术标签:

【中文标题】OpenCV/EMGU (C#) 物体检测【英文标题】:OpenCV/EMGU (C#) detection of objects 【发布时间】:2015-06-04 18:24:37 【问题描述】:

我正在尝试为拾放机器编写一些图像检测代码。我是 OpenCV 的新手,已经经历了很多例子——但仍然有两个悬而未决的问题。第一个我认为我有解决方案,但第二个我迷路了。

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

我很确定我想实现类似http://felix.abecassis.me/2011/10/opencv-bounding-box-skew-angle/ 的东西 - 但我不确定如何将代码翻译成 C# (http://www.emgu.com/wiki/index.php/Main_Page)。任何指针都会有所帮助。

一个问题是,如果零件比握住它的针小,您可以同时看到零件和针。

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

【问题讨论】:

【参考方案1】:

首先,您应该使用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;
  

“合并”的矩形现在应该包含所有的 Pad。问题是这样你不会得到一个角度,因为矩形总是垂直 90°。为了解决这个问题,我将遍历上面显示的轮廓,并将每个轮廓的每个点存储在一个额外的数据容器中。然后我会使用上面提到的最小面积矩形函数并将其应用于所有收集的点。这应该会给你一个带有角度属性的边界矩形。

【讨论】:

我一直在尝试找到一种方法来合并部分 A 的轮廓,然后应用查找矩形——它只是一个部分,你所看到的只是它下面的铜垫 (i.imgur.com/cUynGrU.png) .

以上是关于OpenCV/EMGU (C#) 物体检测的主要内容,如果未能解决你的问题,请参考以下文章

用于物体检测的 kinect 选择

unity 怎么判断碰撞的物体

物体检测4:Android上应用物体监测(TF1)

如何检测物体边框 opencv

使用 ARKit 和 CoreML 从远距离检测物体

为啥物体检测会导致找到多个物体?