问题描述
|
我正在寻找正确的算法集来解决此图像处理问题:
我有一个变形的二进制图像,其中包含一个变形的矩形
我需要找到这个矩形的4个角点的近似值
我可以使用OpenCV计算轮廓,但是随着图像变形,它通常会包含4个以上的角点。
是否有一个很好的近似算法(最好使用OpenCV操作)来使用二进制图像或轮廓描述来找到矩形角点?
图像如下所示:
谢谢!
丹尼斯
解决方法
使用cvApproxPoly函数消除轮廓的节点数量,然后滤除那些节点过多或角度与90度相差很大的轮廓。另请参阅类似答案
, 答案略有不同,请参见
http://opencv.willowgarage.com/documentation/cpp/camera_calibration_and_3d_reconstruction.html
, 查看opencv函数ApproxPoly。它从轮廓近似多边形。
, 尝试哈里斯角落探测器。 OpenCV软件包中有一个示例。您需要为图像使用参数。
并查看其他OpenCV算法:http://www.comp.leeds.ac.uk/vision/opencv/opencvref_cv.html#cv_imgproc_features
, 我会尝试广义霍夫变换,它有点慢,但可以很好地处理变形/不完整的形状。
http://en.wikipedia.org/wiki/Hough_transform
,
即使您从某些缺陷入手,这也将起作用,即您的aboutPolly调用返回五角/六边形。它将所有轮廓(例如transContours)缩小为一个四边形,或者您想要的任何多边形。
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;
}