你可以使用光流法來分析畫面中的物體運動,以判斷是否有障礙物。
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()
除了光流法,你也可以使用邊緣偵測來提升障礙物偵測準確度。
edges = cv2.Canny(gray, 50, 150)
cv2.imshow("Edges", edges)
如果希望更準確地估算障礙物距離,可以使用 單目深度估算(如 MiDaS 模型)來計算深度資訊。
你可以透過 光流法 來偵測物體的運動,並結合 邊緣偵測 或 深度估算 來提升準確度。當障礙物被偵測到時,車輛可以做出適當反應,如減速、停止或規劃繞行路線。