我正在开发一个形状识别应用程序。此时,一组点(x,y)由角点检测器确定(红点,img。2。)。其中四个点(红色框架,img。2。)是一个矩形的顶点(有时是一个小的变形矩形)。在其他人中找到它们的最佳方式是什么?
以下是输入图像的示例:
角落检测后它看起来像这样:
答案 0 :(得分:11)
这不是你问题的答案 - 这只是建议。
在我看来,角落检测器是检测矩形的一种不好的方法 - 计算所有点距离需要花费很多时间,如数学家1975年建议的那样。在这种情况下你必须使用另一种技术:
<强>更新强>
这是另一种解决方案,也适用于灰色图像。
ContourArea / BoundingReactangleArea&gt;恒定
我将此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);
}
}
}
答案 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
请告诉我这是否适合您,或者您找到了更好的解决方案