1. 车载摄像头接入与实时预览

车载摄像头接入与实时预览 学习卡片

任务目标

在车载设备上接入一路摄像头,采集视频流并在本地窗口实时预览,确认设备节点、驱动与显示链路可用。本案例以 Linux/V4L2 环境为例,用 OpenCV 打开摄像头设备并逐帧显示,按 q 退出。

环境与依赖

  • Linux 车载平台,摄像头已生成设备节点(如 /dev/video0)。
  • Python 3 + OpenCV:pip install opencv-python。
  • 确认设备存在:ls /dev/video*;查看支持格式:v4l2-ctl --device=/dev/video0 --list-formats-ext。

采集与预览链路

摄像头 / V4L2 VideoCapture 逐帧 read() imshow 预览

完整实现

import cv2
import sys

DEVICE = "/dev/video0"   # 车载摄像头设备节点
WIDTH, HEIGHT = 1280, 720

def main():
    cap = cv2.VideoCapture(DEVICE, cv2.CAP_V4L2)
    if not cap.isOpened():
        print(f"[ERROR] 无法打开摄像头 {DEVICE}")
        sys.exit(1)

    # 请求分辨率(驱动可能返回最接近的可用值)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)

    real_w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    real_h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv2.CAP_PROP_FPS)
    print(f"[INFO] 已打开 {DEVICE} 分辨率={real_w}x{real_h} FPS={fps:.1f}")

    frames = 0
    while True:
        ok, frame = cap.read()
        if not ok:
            print("[WARN] 读取帧失败,退出")
            break
        frames += 1
        cv2.putText(frame, f"frame:{frames}", (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 2)
        cv2.imshow("Car Camera Preview", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()
    print(f"[INFO] 共预览 {frames} 帧")

if __name__ == "__main__":
    main()

运行与验证

  1. 运行:python3 preview.py。
  2. 观察终端是否打印 [INFO] 已打开 ...,窗口是否出现实时画面。
  3. 画面左上角帧计数持续增长,说明采集与显示链路正常。
  4. 按 q 退出,终端打印累计帧数。

通过条件:窗口能稳定显示实时画面且帧计数递增;若打印 [ERROR] 无法打开摄像头,检查设备节点、权限(sudo usermod -aG video $USER)或更换 DEVICE 编号。