[英]Parallel Line detection using Hough Transform, OpenCV and python
我需要有關我一直在工作的算法的幫助。 我試圖檢測閾值圖像中的所有線條,檢測所有線條,然后僅輸出那些平行的線條。 閾值圖像輸出我感興趣的對象,然后我通過一個精明的邊緣檢測器過濾這個圖像。 然后將此邊緣圖像通過概率霍夫變換。 現在,我希望該算法能夠檢測任何圖像中的平行線。 我想通過嘗試檢測所有線的坐標並計算它們的斜率(然后是角度)來做到這一點。 平行線必須具有相同或幾乎相同的角度,這樣我只能輸出具有相同角度的線。 我可以在圖像中繪制一條假想線,然后將其用作圖像中所有檢測到的線的參考? 我只是不明白如何使用通過函數 cv2.HoughLinesP() 檢測到的所有線的坐標。 這個函數的文檔說輸出是一個 4D 數組,這讓我很困惑。 這是我的代碼的一部分:
rho_res = .1 # [pixels]
theta_res = np.pi / 180. # [radians]
threshold = 50 # [# votes]
min_line_length = 100 # [pixels]
max_line_gap = 40 # [pixels]
lines = cv2.HoughLinesP(edge_image, rho_res, theta_res, threshold, np.array([]),
minLineLength=min_line_length, maxLineGap=max_line_gap)
if lines is not None:
for i in range(0, len(linesP)):
coords = lines[i][0]
slope = (float(coords[3]) - coords[1]) / (float(coords[2]) - coords[0])
cv2.line(img, (coords[0], coords[1]), (coords[2], coords[3]), (0,0,255), 2, cv2.LINE_AA)
關於如何推斷所有檢測到的線然后只輸出平行線的任何想法? 我在網上嘗試了一些算法,但似乎都不起作用。 同樣,我的問題是理解和使用函數 cv2.HoughLinesP() 的輸出變量。 我還找到了一個應該計算斜率的代碼。 我試過了,但只是給了我一個值(一個斜率)。 我想要圖像中所有線條的斜率。
使用atan2
函數計算0..Pi
范圍內所有線的斜率(角度)。 要通過正角度限制范圍,請將Pi
添加到負結果。
按斜率對結果進行排序。 遍歷排序列表,為接近的值建立聯合——這些線幾乎平行。 請注意,對於略有不同的鄰居值,您可能有很長的系列,但系列的開始和結束可能會有很大不同。 所以使用一些(角度)閾值來中斷系列運行。
將霍夫變換投影到角度軸上。 這為您提供了作為 theta 函數的一維信號,該信號與該方向的“線量”成正比。 此信號中的峰值表示具有許多平行線的方向。 找到最大的峰值,它會給你一個 theta。
現在回到霍夫變換圖像,並用這個 theta 值檢測峰值(也許允許一點點擺動)。 現在您將在此方向上擁有所有平行線。
抱歉,我無法為您提供適用於cv2.HoughLinesP
代碼,我不知道此功能。 我希望這個描述能給你一個起點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.