10

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

这是输入图像的示例: 输入图像

角点检测后看起来像这样:

检测到角点的图像

4

4 回答 4

11

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

在我看来,角检测器是检测矩形的一种不好的方法 - 正如mathematician1975所建议的那样,计算所有点距离需要很长时间。在这种情况下,您必须使用另一种技术:

  1. 那个印章是紫色的,所以你应该做的第一件事是颜色分割。
  2. 完成步骤 1后,您可以使用Houhg 变换来检测二进制图像上的线条。或者找到图像中的所有轮廓。
  3. 最后一步是检测矩形。

更新:

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

  1. 做一个阈值将图像转换为 1bit(我使用255 中的200作为阈值)。
  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);
        }
    }
}
于 2012-08-28T11:45:22.343 回答
9

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

于 2012-08-28T11:39:27.893 回答
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..

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

于 2012-08-28T12:11:52.320 回答
0

考虑你应该有 number8但你有 number 7,然后你要添加 number 1(称为 delta 或错误更正)来更正它。

以类似的方式有一个delta矩形坐标来校正矩形。检查点(坐标)是否落在增量矩形内。

矩形坐标如下:

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

让我知道这是否适合您,或者您是否找到了更好的解决方案

于 2012-08-28T11:53:23.380 回答