Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Phát hiện đường thẳng (Line Detection) trong Python với OpenCV

Sử dụng Hough Transform (biến đổi Hough) để phát hiện đường thẳng trong ảnh với OpenCV.

Nguyên lý Hough Transform

Đường thẳng trong không gian Descartes: y = mx + c. Dạng tham số (parametric) trong OpenCV:

ρ = x·cos(θ) + y·sin(θ)

  • ρ (rho): Khoảng cách vuông góc từ gốc đến đường thẳng.
  • θ (theta): Góc giữa đường vuông góc và trục hoành (radian, 0~π).

Accumulator (Bộ tích lũy)

Tạo ma trận 2D (ρ x θ), khởi tạo 0. Mỗi điểm cạnh (edge point) "bỏ phiếu" cho các cặp (ρ, θ) thỏa mãn. Ô có phiếu nhiều nhất = đường thẳng chính.

OpenCV: cv2.HoughLines() và cv2.HoughLinesP()

  • HoughLines(): Standard Hough Transform -> trả về (ρ, θ).
  • HoughLinesP(): Probabilistic Hough Transform -> trả về đoạn thẳng (x1, y1, x2, y2), nhanh hơn.

Ví dụ hoàn chỉnh: Phát hiện đường line trong bãi đỗ xe

import cv2
import numpy as np

# 1. Đọc ảnh
img = cv2.imread("parkingLot1.jpg")

# 2. Chuyển grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 3. Phát hiện cạnh Canny
edges = cv2.Canny(gray, 75, 150)

# 4. HoughLinesP - Probabilistic
# rho=1 pixel, theta=1 độ (pi/180 rad), threshold=30, maxLineGap=250
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, maxLineGap=250)

# 5. Vẽ các đường tìm được
if lines is not None:
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(img, (x1, y1), (x2, y2), (0, 0, 128), 2)

# 6. Hiển thị
cv2.imshow("Edges", edges)
cv2.imshow("Lines Detected", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Giải thích tham số HoughLinesP

Tham sốÝ nghĩaGợi ý
rhoĐộ phân giải khoảng cách (pixel)1
thetaĐộ phân giải góc (radian)np.pi/180 (1 độ)
thresholdSố phiếu tối thiểu để coi là đường30-100 tùy ảnh
minLineLengthĐộ dài tối thiểu của đoạn line50-100
maxLineGapKhoảng cách max để nối 2 đoạn thành 110-250

Kết quả

Ảnh gốc -> Canny edges -> Lines detected (vẽ đè lên ảnh gốc).

Phát hiện đường thẳng (Line Detection) trong Python với OpenCV Phát hiện đường thẳng (Line Detection) trong Python với OpenCV

Mẹo cải thiện

  • Tiền xử lý: Gaussian blur trước Canny để giảm noise.
  • Điều chỉnh threshold Canny (low, high) và Hough threshold.
  • Lọc line theo góc (ngang/dọc) nếu chỉ cần loại cụ thể.