如何检查四个点是否形成矩形

sow*_*izz 10 matlab image-processing shape-recognition

我正在开发一个形状识别应用程序.此时,一组点(x,y)由角点检测器确定(红点,图2).其中四个点(红色框架,图2)是矩形的顶点(有时是一个小的变形矩形).在其他人中找到它们的最佳方法是什么?

以下是输入图像的示例: 输入图像

角落检测后它看起来像这样:

检测到角落的图像

Art*_*huk 11

这不是你问题的答案 - 这只是建议.

在我看来,角落检测器是检测矩形的一种不好的方法 - 计算所有点距离将花费很多时间,如数学家所建议的那样.在这种情况下你必须使用另一种技术:

  1. 那个邮票是紫罗兰色,所以你应该首先做的是颜色分割.
  2. 完成步骤1后,可以使用Houhg变换检测二进制图像上的线条.或者找到图像中的所有轮廓.
  3. 最后一步是检测矩形.

更新:

这是另一种解决方案,也应该适用于灰色图像.

  1. 做一个阈值将图像转换为1位(我使用200从255作为阈值).
  2. 找到面积大于某个常数的新图像中的所有轮廓(我拿了1000).
  3. 找到每个轮廓的边界矩形并进行检查:

ContourArea/BoundingReactangleArea>常量

我把它constant当作0.9.

这个算法给了我下一个结果: 在此输入图像描述

这是OpenCV代码:

Mat src = imread("input.jpg"), gray, result;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

result = Mat(src.size(), CV_8UC1);

cvtColor(src, src, CV_BGR2GRAY);
threshold(src, gray, 200, 255, THRESH_BINARY_INV);
findContours(gray, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

result = Scalar::all(0);
for (size_t i=0; i<contours.size(); i++)
{
    Rect rect = boundingRect(contours[i]);
    if (rect.area() > 1000)
    {
        double area = contourArea(contours[i]);
        if (area/rect.area() > 0.9)
        {
            drawContours(result, contours, i, Scalar(255), -1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


mat*_*975 9

计算每对4个不同点之间的6个长度的集合.在该组6个长度内,如果有超过3个不同的值,则没有矩形(2个相等的边长加上相等的对角线长度)

  • 等一等.你说你有四个点,而不是2500点.这个答案告诉你四个点是否形成一个矩形,并且似乎是该任务的有效解决方案.如果您的问题与您描述的不符,那么您需要更加具体. (2认同)