当前位置:  开发笔记 > 编程语言 > 正文

OpenCV:是否可以从角落检测矩形?

如何解决《OpenCV:是否可以从角落检测矩形?》经验,为你挑选了1个好方法。

我有一张照片,一个人拿着一张纸.我想检测那张纸的矩形.

在此输入图像描述

我尝试过从OpenCV的不同教程和各种SO答案和用于检测正方形/矩形的示例代码,但问题是它们都依赖于某种轮廓.

如果我按照这个squares.cpp例子,我会从轮廓中得到以下结果:

在此输入图像描述

如您所见,手指是轮廓的一部分,因此算法找不到方形.

我也尝试过使用HoughLines()方法,但是我得到了类似的结果:

在此输入图像描述

我可以可靠地检测角落:

在此输入图像描述

图像中还有其他角落,但我将发现的角落限制在<50,并始终找到纸张的角落.

是否有一些算法可以从图像中的多个角点找到矩形?我似乎无法找到现有的方法.



1> dhanushka..:

您可以应用形态滤镜来关闭边缘图像中的间隙.然后,如果找到轮廓,则可以检测到内部闭合轮廓,如下所示.然后找到该轮廓的凸包以获得矩形.

封闭边缘:

关闭

轮廓:

轮廓

凸形轮廓:

船壳

在下面的代码中,我刚刚使用任意内核大小进行形态滤波,并使用面积比阈值滤除了感兴趣的轮廓.您可以使用自己的标准而不是那些标准.

Mat im = imread("Sh1Vp.png", 0); // the edge image
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(11, 11));
Mat morph;
morphologyEx(im, morph, CV_MOP_CLOSE, kernel);

int rectIdx = 0;
vector> contours;
vector hierarchy;
findContours(morph, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
for (size_t idx = 0; idx < contours.size(); idx++)
{
    RotatedRect rect = minAreaRect(contours[idx]);
    double areaRatio = abs(contourArea(contours[idx])) / (rect.size.width * rect.size.height);
    if (areaRatio > .95)
    {
        rectIdx = idx;
        break;
    }
}
// get the convexhull of the contour
vector hull;
convexHull(contours[rectIdx], hull, false, true);

// visualization
Mat rgb;
cvtColor(im, rgb, CV_GRAY2BGR);
drawContours(rgb, contours, rectIdx, Scalar(0, 0, 255), 2);
for(size_t i = 0; i < hull.size(); i++)
{
    line(rgb, hull[i], hull[(i + 1)%hull.size()], Scalar(0, 255, 0), 2);
}

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有