9

我正在寻找一组正确的算法来解决这个图像处理问题:

  • 我有一个扭曲的二进制图像,其中包含一个扭曲的矩形
  • 我需要找到这个矩形的 4 个角点的一个很好的近似值

我可以使用 OpenCV 计算轮廓,但由于图像失真,它通常会包含超过 4 个角点。是否有一个很好的近似算法(最好使用 OpenCV 操作)来使用二进制图像或轮廓描述找到矩形角点?

图像如下所示:

在此处输入图像描述

谢谢!

丹尼斯

4

6 回答 6

6

使用cvApproxPoly函数消除轮廓的节点数,然后过滤掉那些节点过多或角度与 90 度相差很大的轮廓。另见类似答案

于 2011-06-15T12:48:20.023 回答
2

略有不同的答案,请参阅

http://opencv.willowgarage.com/documentation/cpp/camera_calibration_and_3d_reconstruction.html

于 2011-06-18T12:52:50.710 回答
1

看opencv函数ApproxPoly。它从轮廓近似多边形。

于 2011-06-15T12:44:26.497 回答
1

试试哈里斯角检测器。OpenCV 包中有示例。您需要为您的图像使用参数。

并查看其他 OpenCV 算法: http: //www.comp.leeds.ac.uk/vision/opencv/opencvref_cv.html#cv_imgproc_features

于 2011-06-15T13:32:44.137 回答
0

我会尝试广义霍夫变换,它有点慢,但可以很好地处理扭曲/不完整的形状。

http://en.wikipedia.org/wiki/Hough_transform

于 2011-06-15T11:31:35.523 回答
0
  1. 即使您从一些缺陷开始,这也将起作用,即您的 approxPolly 调用返回五边形/六边形。它会将任何轮廓(例如 transContours)缩小为四边形或任何您想要的多边形。
  2. vector<Point> cardPoly;// Quad storage
    int PolyLines = 0;//PolyPoly counter ;)
    double simplicity = 0.5;//Increment of adjustment, lower numbers may be more precise vs. high numbers being faster to cycle.
    while(PolyLines != 4)//Adjust this 
    {
        approxPolyDP(transContours, Poly, simplicity, true);
        PolyLines = Poly.size();
        simplicity += 0.5;
    }
    
于 2014-06-26T11:18:04.913 回答