这与此帖不相似,因为在Python中我们有numpy来解决所有问题。我已经用C++编写了一段代码来查找霍夫线的交点。
vector<Point2f> new_intersection(vector<Vec2f> lines) {
vector<Point2f> intersections;
float m1, c1, m2, c2;
float x1, y1, x2, y2;
float dx, dy, dx1, dy1;
for (auto&& i : combinations(lines, 2)) {
Point pt;
float rho = i[0][0], theta = i[0][1];
Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a * rho, y0 = b * rho;
pt1.x = cvRound(x0 + 1000 * (-b));
pt1.y = cvRound(y0 + 1000 * (a));
pt2.x = cvRound(x0 - 1000 * (-b));
pt2.y = cvRound(y0 - 1000 * (a));
Point pt3, pt4;
float rho1 = i[1][0], theta1 = i[1][1];
double a1 = cos(theta1), b1 = sin(theta1);
double x01 = a1 * rho1, y01 = b1 * rho1;
pt3.x = cvRound(x01 + 1000 * (-b1));
pt3.y = cvRound(y01 + 1000 * (a1));
pt4.x = cvRound(x01 - 1000 * (-b1));
pt4.y = cvRound(y01 - 1000 * (a1));
dx = pt2.x - pt1.x;
dy = pt2.y - pt1.y;
m1 = dy / dx;
c1 = pt1.y - m1 * pt1.x;
dx1 = pt4.x - pt3.x;
dy1 = pt4.y - pt3.y;
m2 = dy1 / dx1;
c2 = pt3.y - m2 * pt3.x;
if (m1 == m2)
continue;
else{
pt.x = (c2 - c1) / (m1 - m2);
pt.y = m1 * pt.x + c1;
intersections.push_back(pt);
}
}
return intersections;
}
我已经使用简单的数学公式找到了所有线条之间的交点,但是这种方法并不能给出所有正确的交点。请查看下面的原始、霍夫和交点图像。
这些是我得到的交点:
交点1:[-3345,116]
交点2:[163,177]
交点3:[-1527,115]
交点4:[164,87]
交点5:[163,116]
交点6:[-2.14748e+09,-2.14748e+09]
从数学上讲,这些公式是正确的,并应该给出正确的交点。
m1==m2
假设线是完全平行的,这实际上并不是这种情况,因此会报告一个非常遥远的交点。您应该考虑在m1
和m2
周围设置一个阈值。此外,当dx
或dx1
非常小时,m1
和m2
变得非常不稳定。 - prog-fh