2013-01-11 43 views
7

当我使用opencv检测具有圆角的矩形时,需要解决一个问题。基本上我使用相同的代码示例squares.c:从具有圆角的矩形检测角点

cvFindContours(gray, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); 
while(contours) 
{ 
    double area=fabs(cvContourArea(contours, CV_WHOLE_SEQ)); 
    if(area < minimum_area || area > maximum_area) { 
     contours = contours->h_next; 
     continue; 
    }    
    result = cvApproxPoly(contours, sizeof(CvContour), storage, 
     CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.05, 0); 
    if(result->total == 4 && 
     fabs(cvContourArea(result,CV_WHOLE_SEQ)) > 1000 && 
     cvCheckContourConvexity(result)) 
     { 

有了这个代码,我通常可以检测的图像,但我需要调整图像的角度和我需要检测图像的角落,如何做到这一点,图像有圆角?问题的发生是因为我不需要在点之间检测到点,例如,我创建了以下图像,黑色线代表现有代码检测到的点,蓝色点代表我需要的点。

enter image description here

感谢的任何帮助。

+0

“我需要解决一个问题”,你的意思是“我想要一个现成的OpenCV函数来解决我的问题”?您的问题可以通过黑点的简单智能排序来解决。从那里你建立四个蓝色的角落。 – mmgp

+0

@mmgp订购黑点?但黑点不包含蓝点! – Ricardo

+0

我在这里找到了解决方案:http://stackoverflow.com/questions/22519545/automatic-perspective-correction-opencv – delkant

回答

0

尝试通过cvResize命令将缩放图像缩小为较小的尺寸并将其应用于该图像。从理论上讲,缩小图像大小应该锐化图像边角并以减少精度为代价减少问题。

+0

注意,这工作得很好,但您需要确保在调整大小时使用合适的插值设置作为“立方体”而不是“最近的邻居”。 –

2

在OpenCV术语中,首先使用FindContoursRETR_EXTERNALCHAIN_APPROX_SIMPLE找到黑色矩形。现在,您可以在FindContours找到的点上使用minAreaRect找到此圆角矩形的最小边界框。要获取此边界框的角点,请使用minAreaRect的返回(中心,(宽度,高度),旋转角度)上的函数BoxPoints。现在你有了红线的四个角落。

+0

minAreaRect实际上会返回一个矩形,而不是像红线所需结果示例中的四边形。 – Wicpar

0

我遇到了问题,其他答案都没有帮助。在我的情况下,我不得不透视正确的数据矩阵,右上角有一个缺失的角落,看起来是哈里斯检测的圆角。

为了解决这个问题,可以用任何你喜欢的方式检测形状,然后得到轮廓的凸包。一旦你有了它,你将不得不提取4条最长的线(没有opencv函数存在,你必须做出自己的提取函数) 然后,你只需得到4条线(你自己的函数)的交点并将其转换回来到一个矩阵进行透视校正。

如果您的介质可能弯曲或者您的检测可能存在缺陷,您可能还希望删除轮廓中与相邻点有较大角度的点,这可能会在最终点产生偏差。