树莓派GStreamer管道问题:无法调用摄像头
我正在实现图像跟踪功能,把教程里读取.mp4文件的代码改成读取摄像头(索引0)后,程序无法正常运行。即使是运行最基础的OpenCV摄像头初始化代码,也会抛出GStreamer相关警告,无法获取实时画面。摄像头硬件本身正常,系统已识别,且安装了picamera2库。
基础测试代码
import cv2 cap = cv2.VideoCapture(0)
报错信息
[ WARN:0@0.196] global ./modules/videoio/src/cap_gstreamer.cpp (2401) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Failed to allocate required memory.
[ WARN:0@0.196] global ./modules/videoio/src/cap_gstreamer.cpp (1356) open OpenCV | GStreamer warning: unable to start pipeline
[ WARN:0@0.196] global ./modules/videoio/src/cap_gstreamer.cpp (862) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
环境信息
- OpenCV版本:4.6.0(已启用GStreamer 1.22.0的VideoI/O组件)
- 已安装picamera2库
- 摄像头设备正常识别
目标跟踪完整代码
import cv2 from tracker import * # 创建跟踪器对象 tracker = EuclideanDistTracker() cap = cv2.VideoCapture(0) # 固定摄像头的目标检测 object_detector = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=40) while True: ret, frame = cap.read() height, width, _ = frame.shape # 提取感兴趣区域 roi = frame[340: 720,500: 800] # 1. 目标检测 mask = object_detector.apply(roi) _, mask = cv2.threshold(mask, 254, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) detections = [] for cnt in contours: # 计算面积,过滤小目标 area = cv2.contourArea(cnt) if area > 100: x, y, w, h = cv2.boundingRect(cnt) detections.append([x, y, w, h]) # 2. 目标跟踪 boxes_ids = tracker.update(detections) for box_id in boxes_ids: x, y, w, h, id = box_id cv2.putText(roi, str(id), (x, y - 15), cv2.FONT_HERSHEY_PLAIN, 2, (255, 0, 0), 2) cv2.rectangle(roi, (x, y), (x + w, y + h), (0, 255, 0), 3) cv2.imshow("roi", roi) cv2.imshow("Frame", frame) cv2.imshow("Mask", mask) key = cv2.waitKey(30) if key == 27: break cap.release() cv2.destroyAllWindows()
疑问
我编程经验不多,看到其他人直接用cv2.VideoCapture(0)就能成功读取摄像头画面,但我这里不行。想知道问题出在哪?该怎么配置GStreamer管道让项目正常运行?
内容的提问来源于stack exchange,提问作者user24088758

