你可以使用光流法來分析畫面中的物體運動,以判斷是否有障礙物。
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 模型)來計算深度資訊。
你可以透過 光流法 來偵測物體的運動,並結合 邊緣偵測 或 深度估算 來提升準確度。當障礙物被偵測到時,車輛可以做出適當反應,如減速、停止或規劃繞行路線。