Python 中使用 OpenCV 進行線條檢測?
在這篇文章中,我們將學習如何使用一種稱為霍夫變換的技術來檢測影像中的線條。
霍夫變換?
霍夫變換是一種特徵提取方法,用於檢測任何簡單的形狀,只要您可以用數學形式表示該形狀。即使形狀稍微斷裂或扭曲,它也能設法檢測到形狀。我們將瞭解它如何用於檢測線條。
“簡單”形狀是指可以用少數幾個引數表示的形狀。例如,一條直線只需要兩個引數(斜率、截距)就可以表示,而一個圓需要三個引數——圓心的座標和半徑(x、y、r)。
使用霍夫變換從影像中檢測線條
一條直線可以用方程表示——或者可以用引數形式表示為,其中(ρ)是原點到直線的垂直距離,而ϴ是這條垂直線與水平軸形成的角度,以逆時針方向測量(OpenCV 使用這種表示方法)。請檢視下圖

因此,如果直線穿過原點下方,則其ρ為正,角度小於180。如果它穿過原點上方,則不採用大於180的角度,而是採用小於180的角度,並將ρ取為負值。任何垂直線都將具有0度,而水平線將具有90度。
累加器
任何直線都可以用這兩個引數(ρ,ϴ)表示。因此,它首先建立一個二維陣列或累加器(用於儲存這兩個引數的值),並且最初將其設定為0。其中行表示ρ,列表示ϴ。陣列的大小取決於我們所需的精度,例如,如果我們需要角度精度為1度,則需要180列,而ρ是可能的最大距離,即影像的對角線長度,ρ是可能的最大距離,即影像的對角線長度。因此,採用1畫素精度,行數可以是影像的對角線長度。
假設我們有一個100*100的影像,中間有一條水平線。取直線的第一個點,我們知道它的(x,y)值。現在,在方程中,將ϴ設定為0、1、2、3…180,並檢查得到的ρ值。對於每個(ρ,ϴ)對,在累加器中相應(ρ,ϴ)單元格的值加1。因此,現在在累加器中,單元格(50,90)= 1,以及其他一些單元格。現在取直線上的第二個點。重複我們對第一個點所做的相同過程。增加您獲得的(ρ,ϴ)對應單元格的值。這一次,單元格(50,90)= 2。因此,我們實際上是在對(ρ,ϴ)值進行投票。我們對直線上的每個點都重複此過程。在每個點上,單元格(50,90)將被遞增或投票,而其他單元格可能不會被投票。這樣,最後,單元格(50,90)將獲得最多的投票。因此,如果您在累加器中搜索獲得最多投票的單元格,則會得到值(50,90),這意味著影像中有一條直線,距離原點50畫素,角度為90度。這就是霍夫變換用於直線檢測的工作原理。
OpenCV 中的霍夫變換
上面解釋的所有內容都封裝在 OpenCV 函式cv2.HoughLines()中。它只返回一個(ρ,ϴ)值的陣列,其中ρ以畫素為單位測量,ϴ以弧度為單位測量。
下面是用 OpenCV 和霍夫直線變換進行線條檢測的程式。
下面是停車場的實際影像,我們將使用霍夫直線變換和 OpenCV 庫對該影像進行線條檢測。

示例
import cv2
import numpy as np
img = cv2.imread("parkingLot1.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 75, 150)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, maxLineGap=250)
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 128), 1)
cv2.imshow("linesEdges", edges)
cv2.imshow("linesDetected", img)
cv2.waitKey(0)
cv2.destroyAllWindows()結果

以及檢測到的線條−

資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP