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

时间:2012-08-28 11:33:20

标签: matlab image-processing shape-recognition

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

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

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

Image with detected corners

4 个答案:

答案 0 :(得分:11)

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

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

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

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

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

      ContourArea / BoundingReactangleArea&gt;恒定

      我将此constant视为 0.9

      这个算法给了我下一个结果: enter image description here

      这是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);
              }
          }
      }
      

答案 1 :(得分:9)

计算每对4个不同点之间的6个长度的集合。如果有超过3个不同的值,那么在6个长度的集合中,你没有矩形(2个相等的边长加上相等的对角线长度)

答案 2 :(得分:2)

您知道通过目测检查点云,您已经可以区分多个矩形吗?换句话说,如果你不进行某种预选程序,你可能会发现许多矩形......

无论如何,除了@ mathematician1975已经给出的方法之外,您还可以检查边(或多或少)是否平行。

让我们调用@ mathematician1975的方法method 1并并行检查method 2。 然后:

%# method 1: 
n1 = |u1-u2|    %#  3 sub., 3 mult, 2 add. per distance
n2 = |u3-u2|    %#  total of 6 distances to compute.
n3 = |u4-u3|    %#  then max 5+4+3+2+1 = 15 comp. to find unique distances
n4 = |u1-u4|    
n5 = |u4-u2|    %#  Total:
n6 = |u3-u1|    %#  12 sub., 18 mult., 12 add, 15 comp



%# method 2:
w1 = u1-u2       %#  3 subtractions per vector
w2 = u3-u2       %#  total of 4 vectors to compute 
w3 = u3-u2
w4 = u1-u4                
                        %#  12 sub.
abs(w1-w3) == [0 0 0]   %#  3 sub., 3 comp., 1 sign.
abs(w2-w4) == [0 0 0]   %#  3 sub., 3 comp., 1 sign.

                        %# Total: 18 sub., 6 comp. 2 sign.

请注意,这些都是最坏的情况;通过一些簿记,您可以大幅降低两者的成本。

另请注意,method 2需要事先知道顶点已经是正确的顺序。如果不是这种情况,则会将成本增加4倍,这比method 1.更多。

请问你是如何计算距离的?

答案 3 :(得分:0)

考虑一下你应该得到号码8,但你得到号码7,然后你要添加号码1(称为增量或纠错)来纠正它。

以类似的方式使用delta矩形坐标来校正矩形。检查点(坐标)是否在delta矩形内。

矩形坐标如下所述:

x+delta,y+delta
x-delta,y+delta
x+delta,y-delta
x-delta,y-delta

请告诉我这是否适合您,或者您找到了更好的解决方案