9

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

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

在此处输入图像描述

谢谢你的帮助。

4

3 回答 3

5

在 OpenCV 术语中,首先使用FindContourswithRETR_EXTERNAL和找到黑色矩形CHAIN_APPROX_SIMPLEminAreaRect现在您通过使用找到的点找到这个圆角矩形的最小边界框FindContours。要获取此边界框的角,请使用BoxPoints返回 (center, (width, height), rotation angle)的函数minAreaRect。现在你有了你所追求的红线的四个角。

于 2013-01-11T20:40:12.200 回答
3

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

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

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

于 2018-02-08T08:14:57.600 回答
0

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

于 2013-01-11T09:20:01.427 回答