一、cv2.fitline是什麼
cv2.fitline函數是OpenCV中的一個較為重要的函數,它可以通過擬合一條直線,對圖像中的一些邊緣或輪廓進行線性擬合。在圖像分析和處理的許多領域中都會用到這個函數,例如斑點檢測、物體跟蹤等。
cv2.fitline函數的具體用法為:
cv2.fitline(points, distType, param, reps, aeps)
其中,points代表的是二維點集,distType是擬合線時所使用的距離類型,param表示該距離類型的額外參數,reps是隨機樣本取樣時的次數,aeps表示擬合線的精度。
二、使用cv2.fitline實現線性擬合
通過cv2.fitline函數可以對圖像中的邊緣或輪廓進行線性擬合,以便於後續的分析和處理。下面我們通過一個實例來展示如何使用cv2.fitline函數實現線性擬合。
首先我們準備一個二值化圖像,用於展示該函數的作用。具體的實現代碼如下所示:
import cv2 import numpy as np img = np.zeros((512,512,1), np.uint8) cv2.rectangle(img, (100,100), (300,250), (255,255,255), 3) cv2.imshow("Image", img) cv2.waitKey(0) cv2.destroyAllWindows()
運行結果如下所示:
接下來我們對這個圖像中的直線進行線性擬合,具體實現代碼如下所示:
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray,50,150,apertureSize = 3) lines = cv2.HoughLines(edges,1,np.pi/180,200) for line in lines: rho,theta = line[0] a = np.cos(theta) b = np.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2) cv2.imshow('houghlines3',img) cv2.waitKey(0) cv2.destroyAllWindows()
運行結果如下所示:
緊接著,我們可以使用cv2.fitline函數對得到的直線進行線性擬合,具體實現代碼如下所示:
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray,50,150,apertureSize = 3) lines = cv2.HoughLines(edges,1,np.pi/180,200) for line in lines: rho,theta = line[0] a = np.cos(theta) b = np.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2) [vx,vy,x,y] = cv2.fitLine(lines[0], cv2.DIST_L2,0,0.01,0.01) lefty = int((-x*vy/vx) + y) righty = int(((cols-x)*vy/vx)+y) cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2) cv2.imshow('fitline',img) cv2.waitKey(0) cv2.destroyAllWindows()
運行結果如下所示:
我們可以看到,在經過擬合的直線上,出現了兩個綠色的點,它們分別代表了直線的起點和終點。
三、參數詳解
cv2.fitline函數中所涉及的參數對於線性擬合的效果有著非常重要的影響。下面我們對參數進行詳細的說明。
a. points參數
points參數是cv2.fitline函數中用於放置二維點集的參數,該參數是一個(N * 2)的NumPy數組,其中每一行表示二維空間中一個點的坐標,N表示樣本點的個數。需要注意的是,該參數必須具有單精度或雙精度浮點類型。
b. distType參數
distType參數是擬合線時使用的距離類型,在cv2.fitline函數中可以指定為以下幾種值:
- cv2.DIST_L2:表示歐幾里得距離(L2範數)
- cv2.DIST_L1:表示曼哈頓距離(L1範數)
- cv2.DIST_L12:表示L1-L2混合距離(設置參數的方式如下所示:cv2.DIST_L12(0.5))
- cv2.DIST_FAIR:表示矯正後的Fair距離(設置參數的方式如下所示:cv2.DIST_FAIR(0.5))
- cv2.DIST_WELSCH:表示矯正後的Welsch距離(設置參數的方式如下所示:cv2.DIST_WELSCH(0.5))
c. param參數
param參數表示distType所對應的額外參數,對於魯棒估計距離或某些混合距離類型,該參數是必須設置的。如果沒有設置該參數,cv2.fitline函數將以0作為默認值進行計算。該參數的類型必須是浮點型。
d. reps參數
reps參數是隨機樣本取樣的次數。當計算分量時,cv2.fitline函數會從給定的二維點集中隨機提取reps組點並計算擬合直線。默認值是2。
e. aeps參數
aeps通常表示擬合的精度,但實際上是一個與誤差範圍有關的閾值。當兩點之間的垂足距離小於aeps時,該點被認為是與擬合直線「吻合」的點。默認值是0.01。
四、cv2.fitline的實際應用場景
cv2.fitline函數在圖像分析和處理的許多領域中都有著廣泛的應用。例如,它可以用於:
- 斑點檢測:當斑點呈線狀的時候,使用cv2.fitline函數可以得到斑點的長度和方向。
- 物體跟蹤:當物體呈線狀的時候,使用cv2.fitline函數可以得到物體的速度和方向。
- 邊緣檢測:cv2.fitline可以用於提取邊緣的方向和長度。
- 運動估計:利用cv2.fitline可以估計圖像中物體的運動方向和速度。
五、總結
本文對OpenCV中cv2.fitline函數進行了比較詳細的講解。簡單來說,cv2.fitline可以通過擬合一條直線,對圖像中的一些邊緣或輪廓進行線性擬合。在圖像分析和處理的許多領域中都會用到這個函數。除此之外,本文還介紹了cv2.fitline函數的具體用法、參數詳解以及實際應用場景等內容。
原創文章,作者:KOIC,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/138162.html