找到矩形时忽略外部点

时间:2013-05-14 22:28:37

标签: c# opencv computer-vision emgucv

我有一些这样的图像,我需要找到中心矩形

enter image description here

我使用EmguCV示例的变体来查找矩形,并附带此

using (MemStorage storage = new MemStorage())
{ //allocate storage for contour approximation

    //Contour<Point> contours = gray.FindContours()
    Contour<Point> contours = gray.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
     Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST,
  storage);

    for (; contours != null; contours = contours.HNext)
    {
        Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.05, storage);
        //Seq<Point> currentContour = contours.GetConvexHull(Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE);

        if (contours.Area > MinRectangleArea) //only consider contours with area greater than 20000
        {
            if (currentContour.Total == 4) //The contour has 4 vertices.
            {
                bool isRectangle = true;
                Point[] pts = currentContour.ToArray();
                LineSegment2D[] edges = PointCollection.PolyLine(pts, true);

                for (int i = 0; i < edges.Length; i++)
                {
                    double angle = Math.Abs(edges[(i + 1) % edges.Length].GetExteriorAngleDegree(edges[i]));
                    if (angle < 90 - RectangleAngleMargin  || angle > RectangleAngleMargin + 90)
                    {
                        isRectangle = false;
                        break;
                    }
                }

                if (isRectangle)
                {
                    boxList.Add(currentContour.GetMinAreaRect());
                }
            }
        }
    }

}

在这些图像上执行该操作的结果有时会发现这两个矩形:

enter image description here

橙色矩形是好的,这就是我需要的。但我不想要蓝色。有时四个顶点位于图像的边界,通常其中一个出点。

将FindContours函数的RETR_TYPE更改为CV_RETR_EXTERNAL,我只得到蓝色矩形,所以我想知道是否有一个选项不能获得外部点的轮廓。

实际图像实际上可以在橙色内部有较小的矩形(或者一条线显示出分割矩形),所以在那之后我选择了更大的矩形作为我想要的那个,但是不能用那个蓝色那样做之一。

1 个答案:

答案 0 :(得分:3)

看一下你的样本图片我会选择另一种方法。

代替经典轮廓检测,如果您执行霍夫线检测然后执行找到的线的交点,您将找到您正在搜索的矩形的四个顶点......

如果您需要一些编码帮助,请告诉我,我会编辑我的答案。