You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:08:21