OpenCV 線檢測

Ammar Ali 2024年2月15日
  1. 在 Python 中使用 OpenCV 的 HoughLines() 函式檢測影象中的線條
  2. 在 Python 中使用 OpenCV 的 HoughLinesP() 函式檢測影象中的線條
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)

輸出:

檢測線第 1 部分

我們可以根據給定的影象更改 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)

輸出:

檢測線第 1 部分

在這種情況下,兩個函式的結果是相同的,但它可以根據給定的影象而變化。我們可以根據給定的影象更改 Canny()HoughLinesP() 函式的引數以獲得所需的結果。

可以通過更改 line() 函式的第四個和第五個引數來更改檢測到的線條的顏色和線條粗細。顏色應為 BGR 三元組值,線條粗細應為整數。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相關文章 - OpenCV Image