2013-05-13 130 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'。考慮到幾乎平行線的差異可能會導致您的產品彼此非常接近,因此「浮動」可能無法保持足夠的精度。