簡體   English   中英

使用 Hough Transform、OpenCV 和 python 進行平行線檢測

[英]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代碼,我不知道此功能。 我希望這個描述能給你一個起點。

我只是不明白如何使用通過函數 cv2.HoughLinesP() 檢測到的所有線的坐標。 這個函數的文檔說輸出是一個 4D 數組,這讓我很困惑。

4D 數組只是檢測到的線的輸出向量。 每條線由一個 4 元素向量 (x1, y1, x2, y2) 表示,其中 (x1,y1) 和 (x2, y2) 是每個檢測到的線段的終點。

請參閱所附圖片以了解這些含義。 請記住,那些協調的人在圖像空間中。

檢測線

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM