2013-05-13 169 views
4

我试图计算使用霍夫变换的光流算法的线之间的交点。但是,当我使用我的算法计算交叉点时,我没有得到应有的点。如何计算两条线之间的交点

我将行保存为我创建的名为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; 
} 

该方法是否正确,或者我做错了什么?据我所知,它应该工作,因为它对于我通过硬编码完成的单个点来说,但是,在使用实际数据时,我无法获得良好的交集。

回答

2

(det == 0)在使用浮点算法时不太可能是真实的,因为它不精确。

通常使用类似(fabs(det) < epsilon)的某些合适的epsilon值(如1e-6)。

如果这样不能解决问题,请显示一些实际的数字,以及预期的结果和实际结果。

+0

当处理实际数据时,几乎平行的线条也不太可能......但这不是真正的问题,会发生什么情况是真实线条应该相交的地方不会被返回。 (我为了调试目的而直观地显示数据 – AndrewSchade 2013-05-13 14:40:43

+0

那么返回什么?你的输入是什么?什么是中间值? – Useless 2013-05-13 15:07:03

4

考虑数学方:如果我们有两个线方程:

Y = M1 * X + C1
Y =平方米* X + C2

的交点:( X,Y),由以下等式描述两行:

Y = M1 * X + C1
Y =平方米* X + C2

是满足这两个公式,即点:

M1 * X + C1 =平方米* X + C2
(Y - 1)/ M1 =(Y - C2)/平方米

从而交点坐标的点是:

intersectionX =(C2 - C1)/(M1 - 平方米)
intersectionY =(M1 * C1 - C2 * M2)/ M1-M2或intersectionY = M1 * intersectionX + C1

注:C1,M1和C2,M2是通过获取任何2点的线的计算和把它们放在直线方程中。

+0

Y = m1c2-c1m2/m2-m1 = m1c2-c1-m1 – 2014-03-18 04:55:45

0

假设您的公式是正确的,请尝试将所有中间参数声明为'double'。考虑到几乎平行线的差异可能会导致您的产品彼此非常接近,因此“浮动”可能无法保持足够的精度。