最近在做圖像的透射變換,有一個關鍵問題就是找到原圖像內四邊形的四個頂點。
在處理過程中,經過霍夫直線檢測後,即可得到四邊形的四邊。而邊的表示形式爲:[x1,y1,x2,y2],即以兩點確定一條直線。
因此,需要通過編寫一個函數計算兩直線交點。
首先,我們定義:直線L1:[x1,y1,x2,y2],直線L2:[x3,y3,x4,y4]
簡單解釋一下原理:
兩點確定一條直線,而每一條直線都可以表示爲:Y=kX+b 的形式(即直線的斜截式方程),找到兩條直線的斜截式方程後聯立方程組,求解。
聯立方程組爲:,其中|,之後任意取線上一點即可得b1與b2,至此兩條直線就已經得到。
之後,推導計算公式
通過聯立的方程組,可以解得橫座標x爲:,取直線L1,將x帶入即可得縱座標y。
最後,考慮特殊情況
若某一直線爲水平直線,斜率爲0,此時交點縱座標直接取水平線上兩點任一點的縱座標。(該情況不會引起程序錯誤,因此未加考慮)
若某一直線爲豎直直線,斜率不存在,此時交點橫座標直接取豎直線上兩點任一點的橫座標。(代碼考慮L2可能存在該情況)
若兩條直線均水平或均豎直,則無交點。(代碼未考慮該情況)
代碼
def cross_point(line1,line2):#計算交點函數
x1=line1[0]#取四點座標
y1=line1[1]
x2=line1[2]
y2=line1[3]
x3=line2[0]
y3=line2[1]
x4=line2[2]
y4=line2[3]
k1=(y2-y1)*1.0/(x2-x1)#計算k1,由於點均爲整數,需要進行浮點數轉化
b1=y1*1.0-x1*k1*1.0#整型轉浮點型是關鍵
if (x4-x3)==0:#L2直線斜率不存在操作
k2=None
b2=0
else:
k2=(y4-y3)*1.0/(x4-x3)#斜率存在操作
b2=y3*1.0-x3*k2*1.0
if k2==None:
x=x3
else:
x=(b2-b1)*1.0/(k1-k2)
y=k1*x*1.0+b1*1.0
return [x,y]
對程序進行測試:line1=[1,1,-1,-1]
line2=[-1,1,1,-1]
print cross_point(line1, line2)
結果如下,且正確:
編程環境爲python2.7,直線的數據結構爲列表。
若有任何問題歡迎交流~謝謝觀看