OpenCV 線檢測
本教程將討論在 Python 中使用 OpenCV 的 HoughLines()
和 HoughLinesP()
函式檢測影象中的線條。
在 Python 中使用 OpenCV 的 HoughLines()
函式檢測影象中的線條
OpenCV 的 HoughLines()
函式用於使用標準霍夫線變換檢測影象中存在的線。
要檢測影象中存在的線條,我們必須使用 imread()
函式讀取影象,如果它還沒有灰度,則將其轉換為灰度。
之後,我們必須使用 OpenCV 的 Canny()
函式找到給定影象的邊緣。Canny()
函式的第一個引數是給定的影象。
第二個和第三個引數是滯後過程的第一個和第二個閾值。第四個引數是光圈大小,第五個引數是梯度值。
Canny()
函式的輸出根據閾值包含給定影象的邊緣。我們必須通過 HoughLines()
函式內部的邊緣來檢測影象中存在的線條。
HoughLines()
函式的第一個引數是邊緣檢測器的輸出,它應該是灰度影象。第二個引數是以畫素為單位的引數解析度。
第三個引數是以弧度為單位的引數解析度。第四個引數是用作內聯檢測的最小交叉點數的閾值。
其他引數是預設引數。之後,我們必須使用 OpenCV 的 line()
函式使用迴圈在原始影象上一一繪製每一行。
之後,我們可以使用 OpenCV 的 imshow()
函式顯示原始影象和檢測到線條的影象。
例如,讓我們檢測數獨影象中存在的線條。
請參閱下面的程式碼。
import cv2 as cv
import numpy as np
import math
src_img = cv.imread('test.png')
cv.imshow('Original Image',src_img)
dst_img = cv.Canny(src_img, 50, 200, None, 3)
lines = cv.HoughLines(dst_img, 1, np.pi / 180, 150, None, 0, 0)
for i in range(0, len(lines)):
rho_l = lines[i][0][0]
theta_l = lines[i][0][1]
a_l = math.cos(theta_l)
b_l = math.sin(theta_l)
x0_l = a_l * rho_l
y0_l = b_l * rho_l
pt1_l = (int(x0_l + 1000*(-b_l)), int(y0_l + 1000*(a_l)))
pt2_l = (int(x0_l - 1000*(-b_l)), int(y0_l - 1000*(a_l)))
cv.line(src_img, pt1_l, pt2_l, (0,0,255), 3, cv.LINE_AA)
cv.imshow("Image with lines", src_img)
cv.waitKey(0)
輸出:
我們可以根據給定的影象更改 Canny()
和 HoughLines()
函式的引數以獲得所需的結果。
可以通過更改 line()
函式的第四個和第五個引數來更改檢測到的線條的顏色和線條粗細。
顏色應為 BGR 三元組值,線條粗細應為整數。
在 Python 中使用 OpenCV 的 HoughLinesP()
函式檢測影象中的線條
HoughLinesP()
函式使用概率霍夫線變換來檢測線。我們必須使用 imread()
函式讀取給定影象,將其轉換為灰度,然後使用 Canny()
找到它的邊緣。
之後,我們可以通過 HoughLinesP()
函式內部的邊緣來檢測影象中存在的線條。HoughLinesP()
函式的前五個引數與上面討論的 HoughLines()
函式相同。
第六個和第七個引數用於定義線間距的最小值和最大值。
例如,讓我們檢測數獨影象中存在的線條。
請參閱下面的程式碼。
import cv2 as cv
import numpy as np
import math
src_img = cv.imread('test.png')
cv.imshow('Original Image',src_img)
dst_img = cv.Canny(src_img, 50, 200, None, 3)
linesP = cv.HoughLinesP(dst_img, 1, np.pi / 180, 50, None, 50, 10)
for i in range(0, len(linesP)):
lin = linesP[i][0]
cv.line(src_img, (lin[0], lin[1]), (lin[2], lin[3]), (0,0,255), 3, cv.LINE_AA)
cv.imshow("Image with lines", src_img)
cv.waitKey(0)
輸出:
在這種情況下,兩個函式的結果是相同的,但它可以根據給定的影象而變化。我們可以根據給定的影象更改 Canny()
和 HoughLinesP()
函式的引數以獲得所需的結果。
可以通過更改 line()
函式的第四個和第五個引數來更改檢測到的線條的顏色和線條粗細。顏色應為 BGR 三元組值,線條粗細應為整數。