And*_*ade 3 c++ opencv intersection line
我试图使用霍夫变换计算光流算法的线之间的交点.但是,当我使用算法计算交叉点时,我没有得到我应该得到的分数.
我将Lines保存为我创建的类的实例ImageLine.这是我的交集方法的代码.
Point ImageLine::intersectionWith(ImageLine other)
{
float A2 = other.Y2() - other.Y1();
float B2 = other.X2() - other.X1();
float C2 = A2*other.X1() + B2*other.Y1();
float A1 = y2 - y1;
float B1 = x2 - x1;
float C1 = A1 * x1 + B1 * y1;
float det = A1*B2 - A2*B1;
if (det == 0)
{
return Point(-1,-1);
}
Point d = Point((B2 * C1 - B1 * C2) / det, -(A1 * C2 - A2 * C1) / det);
return d;
}
Run Code Online (Sandbox Code Playgroud)
这种方法是正确的,还是我做错了什么?据我所知,它应该可以工作,就像我硬编码的单点一样,但是,在使用真实数据时,我无法获得良好的交集.
考虑数学方面:如果我们有两个线方程:
y = m1*x + c1
y = m2*x + c2
交点:(X,Y),由以下等式描述的两条线:
Y = m1*X + c1
Y = m2*X + c2
是满足两个方程的点,即:
m1*X + c1 = m2*X + c2
(Y - c1)/ m1 =(Y - c2)/ m2
因此交点坐标是:
intersectionX =(c2 - c1)/(m1 - m2)
交叉点Y =(m1*c1 - c2*m2)/ m1-m2或交叉点Y = m1*intersectionX + c1
注意:c1,m1和c2,m2是通过获取一条直线的任意两个点并将它们放入线方程来计算的.
(det == 0)当您使用浮点运算时,不太可能成立,因为它不精确。
就像是(fabs(det) < epsilon)对于 epsilon 的某个合适值(例如 ),通常使用1e-6。
如果这不能解决问题,请显示一些实际数字,以及预期结果和实际结果。
| 归档时间: |
|
| 查看次数: |
23689 次 |
| 最近记录: |