gpt4 book ai didi

c++ - 获取霍夫线opencv c++的交点

转载 作者:行者123 更新时间:2023-12-02 10:22:24 25 4
gpt4 key购买 nike

这与此不相似 post ,因为在 python 中我们有 numpy 来解决所有问题。我用 C++ 编写了一个代码来查找 hough 线的交点。

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;
}

我是通过使用简单的数学公式找到除平行线之外的所有线之间的交点来完成此操作的。问题是这并没有给出所有正确的交叉点。在下面检查原始图像、霍夫图像和交叉点图像。

Original Hough Intersections

这些是我得到的交点

inter1: [-3345, 116]

inter2: [163, 177]

inter3: [-1527, 115]

inter4: [164, 87]

inter5: [163, 116]

inter6: [-2.14748e+09, -2.14748e+09]

从数学上讲,公式是正确的,应该给出正确的分数。

最佳答案

您不应依赖公式 c = y - m * x,因为此公式 - 虽然在数学上是正确的 - 无法表示垂直线(例如 theta = 0 ) 正确,所以你的计算要么变得不稳定(由于精度有限,如果线非常接近垂直)或完全失败,因为如果 pt1.x == pt2,m 变为无穷大。 x.

相反,您应该使用 vector 计算交点。这个计算可能有点复杂,但是垂直线没有任何问题。使用 vector ,您可以为 lambdaalpha 求解 pt1 + lambda * (pt2 - pt1) = pt3 + alpha * (pt4 - pt3)然后将该值放在相应的一侧。在代码中,这看起来像这样:

float dx0 = pt2.x - pt1.x;
float dx1 = pt4.x - pt3.x;
float dy0 = pt2.y - pt1.y;
float dy1 = pt4.y - pt3.y;
//Solve for lambda:
float div = (dy0 * dx1) - (dx0 * dy1);
if(abs(div) < EPSILON) { continue; } //lines are parallel
float lambda = (((pt1.x - pt3.x) * dx1) + ((pt1.y - pt3.y) * dy1)) / div;
//put lambda back into pt1 + lambda * (pt2 - pt1) to calculate intersection point:
pt.x = pt1.x + (lambda * dx0);
pt.y = pt1.y + (lambda * dy0);

如果您愿意,还有一个公式可以直接使用 theta 和 rho 计算交点。

关于c++ - 获取霍夫线opencv c++的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59529201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com