使用單一攝影機進行障礙物偵測

1. 光流法 (Optical Flow)

你可以使用光流法來分析畫面中的物體運動,以判斷是否有障礙物。

方法:

程式範例:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)
ret, prev_frame = cap.read()
prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    flow = cv2.calcOpticalFlowFarneback(prev_gray, gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)

    magnitude, angle = cv2.cartToPolar(flow[..., 0], flow[..., 1])
    
    hsv = np.zeros_like(frame)
    hsv[..., 1] = 255
    hsv[..., 0] = angle * 180 / np.pi / 2
    hsv[..., 2] = cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX)
    bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)

    cv2.imshow("Optical Flow", bgr)
    prev_gray = gray

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
    

2. 影像梯度與光流結合

除了光流法,你也可以使用邊緣偵測來提升障礙物偵測準確度。

方法:

程式範例:

edges = cv2.Canny(gray, 50, 150)
cv2.imshow("Edges", edges)
    

3. 深度估算 (Monocular Depth Estimation)

如果希望更準確地估算障礙物距離,可以使用 單目深度估算(如 MiDaS 模型)來計算深度資訊。

4. 當障礙物檢測到時的應對策略

結論

你可以透過 光流法 來偵測物體的運動,並結合 邊緣偵測深度估算 來提升準確度。當障礙物被偵測到時,車輛可以做出適當反應,如減速、停止或規劃繞行路線。