【问题标题】:OpenCV/EMGU (C#) detection of objectsOpenCV/EMGU (C#) 物体检测
【发布时间】: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)。任何指针都会有所帮助。

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

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

【问题讨论】:

    标签: c# opencv emgucv


    【解决方案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) .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2012-12-30
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多