从带圆角的矩形中检测角点

时间:2013-01-11 00:02:03

标签: opencv

当我使用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

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

尝试通过cvResize命令将图像缩放到较小的尺寸,并将该代码应用于它。理论上减小图像尺寸应该锐化图像角落并减少您的问题,但代价是会失去精度。

答案 2 :(得分:0)

我有这个问题,其他答案都没有帮助。在我的情况下,我不得不透视正确的数据矩阵,右上方有一个缺角,看起来是哈里斯检测的四舍五入。

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

如果您的介质可以弯曲或者您的检测可能存在缺陷,您可能还需要从轮廓中删除相对于相邻点具有高角度的点,这可能会在最终点产生偏差。