【问题标题】:OpenCV: Is it possible to detect rectangle from corners?OpenCV:是否可以从角落检测矩形?
【发布时间】:2016-03-26 11:31:57
【问题描述】:

我有一张照片,其中有人拿着一张纸。我想检测那张纸的矩形。

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

如果我遵循squares.cpp 示例,我会从轮廓中得到以下结果:

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

我也尝试使用HoughLines() 方法,但得到的结果与上述类似:

我可以可靠地检测到角落:

图片中还有其他边角,但我将找到的总边角限制为 总是找到这张纸的边角。

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

【问题讨论】:

  • 基本上,您需要获取轮廓,将它们提供给appoxPolyDP(),然后检查生成的approxCurve 大小。如果是 4,你有一个四边形,那些是你的角。之后您可能需要重新安排角落的顺序,因为无法保证顺序。如果您需要更多帮助,请告诉我。
  • 我试过了,但是手指的轮廓打破了纸张的侧边,然后 appoxPolyDP 没有找到它。
  • 那么我不确定。你能遍历轮廓检查 90° 角吗?
  • 有趣的想法,但我不确定如何将角相互匹配。
  • photoshop 放手,然后自动化

标签: c++ algorithm opencv computer-vision


【解决方案1】:

您可以应用形态过滤器来缩小边缘图像中的间隙。然后,如果找到轮廓,则可以检测到内部闭合轮廓,如下所示。然后找到这个轮廓的凸包得到矩形。

闭合边:

轮廓:

凸包:

在下面的代码中,我刚刚为形态过滤器使用了任意内核大小,并使用面积比阈值过滤掉了感兴趣的轮廓。您可以使用自己的标准来代替那些。

代码

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<vector<Point>> contours;
vector<Vec4i> 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<Point> 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多