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

Posted

技术标签:

【中文标题】从带有圆角的矩形中检测角点【英文标题】:Detect corner point from rectangle with rounded corners 【发布时间】:2013-01-11 00:02:03 【问题描述】:

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

使用此代码,我通常可以检测到图像,但我需要调整图像的视角,为此我需要检测图像的角,如何做到这一点并且图像具有圆角?问题的发生是因为我不需要在点之间检测到点,例如,我创建了下图,其中黑线代表现有代码检测到的点,蓝点是我需要的点?

感谢您的帮助。

【问题讨论】:

“我需要解决一个问题”是指“我想要一个现成的 OpenCV 函数来解决我的问题”吗?您的问题可以通过简单的黑点智能排序来解决。从那里开始构建四个蓝色角。 @mmgp 订购黑点?但黑点不包含蓝点! 我在这里找到了解决方案:***.com/questions/22519545/… 【参考方案1】:

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

【讨论】:

minAreaRect 实际上会返回一个矩形,而不是像红线期望结果示例中那样的四边形。【参考方案2】:

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

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

如果您的介质可能弯曲或您的检测可能有缺陷,您可能还需要从轮廓中删除相对于相邻点具有较大角度的点,这可能会导致最终点出现偏差。

【讨论】:

【参考方案3】:

尝试通过 cvResize 命令将图像缩放到更小的尺寸并将该代码应用于它。从理论上讲,减小图像大小应该会锐化图像角并以损失精度为代价来减少您的问题。

【讨论】:

请注意,这很好用,但您需要确保在调整大小时使用合适的插值设置,例如 cubic 而不是 nearest neighbor

以上是关于从带有圆角的矩形中检测角点的主要内容,如果未能解决你的问题,请参考以下文章

CAD绘制矩形框命令

将标签绘制为带有边缘而不是圆角的矩形

创建带有圆角矩形的进度指示器

带有透明圆角矩形的 UIView?

如何在 iPhone 上绘制一个带有剪裁而不是圆角的矩形?

canva绘制圆角矩形