树莓派4使用Picamera Module v3调用摄像头超时问题求助
问题:树莓派4使用Picamera Module v3时OpenCV摄像头超时错误
运行代码时出现如下错误:
[ WARN:0@18.728] global cap_v4l.cpp:1134 tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout.
对应代码:
import cv2 from ultralytics import YOLO import numpy as np import imutils model = YOLO('best (5) (1).pt') cap = cv2.VideoCapture(0) isClosed = True color = (255, 255, 255) thickness = 3 while cap.isOpened(): success, frame = cap.read() if success: results = model(frame) annotated_frame = results[0].plot() res = results[0] masks = res.masks mask1 = masks[0] mask = mask1.data[0].numpy() polygon = mask1.xy[0] polygon = polygon.reshape((-1, 1, 2)) #print(point) #image = cv2.polylines(frame, np.int32([polygon]), isClosed, color, thickness) image = np.zeros(frame.shape,np.uint8) cv2.fillPoly(image,np.int32([polygon]), color) cv2.imshow("YOLOv8 Inference", frame) cv2.imshow("YOLOv8 Inference1", image) if cv2.waitKey(1) & 0xFF == ord("q"): break else: break cap.release() cv2.destroyAllWindows()
已尝试修改cap = cv2.VideoCapture(0)为cap = cv2.VideoCapture(1)或(-1),无效果,寻求解决方法。
解决方案
1. 确认摄像头已启用且硬件连接正常
- 运行
sudo raspi-config,进入Interface Options -> Camera,选择启用摄像头,重启树莓派。 - 检查摄像头排线是否插紧,确保物理连接无问题。
2. 检查V4L2设备节点
- 运行
ls /dev/video*,查看可用的摄像头设备。Picamera Module v3在V4L2下可能对应/dev/video10而非video0,尝试修改代码中的设备号:cap = cv2.VideoCapture(10)
3. 指定OpenCV的摄像头API并调整分辨率
Picamera v3的默认分辨率较高,可能导致OpenCV读取超时,需手动指定API和分辨率:
cap = cv2.VideoCapture(0, cv2.CAP_V4L2) # 指定V4L2 API cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
如果设备号0不行,替换为步骤2中查到的正确设备号。
4. 使用Picamera2库替代直接调用VideoCapture
Picamera2是树莓派官方针对新摄像头模块的专用库,兼容性更好。先安装依赖:
sudo apt install python3-picamera2
修改代码使用Picamera2捕获帧并转换为OpenCV格式:
import cv2 from ultralytics import YOLO import numpy as np from picamera2 import Picamera2 model = YOLO('best (5) (1).pt') picam2 = Picamera2() # 配置摄像头分辨率,可根据需求调整 picam2.configure(picam2.create_preview_configuration(main={"format": "RGB888", "size": (640, 480)})) picam2.start() isClosed = True color = (255, 255, 255) thickness = 3 while True: frame = picam2.capture_array() # 转换为OpenCV的BGR格式(YOLO默认处理BGR) frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) results = model(frame) res = results[0] if res.masks: mask1 = res.masks[0] polygon = mask1.xy[0].reshape((-1, 1, 2)) image = np.zeros(frame.shape, np.uint8) cv2.fillPoly(image, np.int32([polygon]), color) cv2.imshow("YOLOv8 Inference", frame) cv2.imshow("YOLOv8 Inference1", image) if cv2.waitKey(1) & 0xFF == ord("q"): break picam2.stop() cv2.destroyAllWindows()
5. 更新OpenCV和系统依赖
确保系统和OpenCV是最新版本,运行:
sudo apt update && sudo apt upgrade pip install --upgrade opencv-python
内容的提问来源于stack exchange,提问作者Khoa Huỳnh Minh
相关产品推荐
相关产品推荐

