如果我在释放网络摄像头后再次访问它,则 OpenCV Python 捕获失败

Posted

技术标签:

【中文标题】如果我在释放网络摄像头后再次访问它,则 OpenCV Python 捕获失败【英文标题】:OpenCV Python capture fails if I access a webcame again after releasing it 【发布时间】:2018-08-29 18:07:11 【问题描述】:

我正在开发一个多线程应用程序来从四个 USB 网络摄像头捕获图像。为简单起见和早期开发,我使用的是 640x480 和 30fps 的 Logitech C920。

我有一个简单的函数,它打开一个相机并设置一些参数,然后释放相机。因为这是一个多线程应用程序,当按下按钮时,每个线程都会运行四个线程。效果很好。

def camParameter(previewName, camID):
    #Set camera object and set parameters
    start_time = time.time()
    cam_test = True
    while cam_test:  
        cam = cv2.VideoCapture(camID)  
        present_time = time.time()
        if present_time - start_time > 2:
            print("Could not open camera ", str(camID))
            break
        if cam.isOpened():
            cam_test=False

    width = 640
    height = 480
    fps = 30
    test_width = cam.get(3)
    test_height = cam.get(4)
    test_fps = cam.get(5)

    if test_width != width:
        cam.set(3,width) 
    if test_height != height:
        cam.set(4,height) 
    if test_fps != fps:
        cam.set(5,fps) 

    print("Parameters set for camera ", str(camID))
    cam.release()

但是,如果我再次调用该函数,或尝试打开摄像头进行流式传输,则会收到以下错误:

VIDEOIO 错误:V4L2:OpenCV 不支持传入图像的像素格式 无法停止流:设备或资源繁忙

我可以用 GUVCviewer 打开摄像头,或者拔下/重新插入摄像头以恢复访问权限。

任何想法为什么相机的第二次访问会导致此问题,或者如何解决它?

我已验证相机实际上已发布。我可以访问相机

【问题讨论】:

我试过了,效果很好。你可以尝试更新opencv吗? 【参考方案1】:

我用 GStreamer 重新编译了 openCV - 它对多线程更加友好。

【讨论】:

以上是关于如果我在释放网络摄像头后再次访问它,则 OpenCV Python 捕获失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python/Linux 读取网络摄像头的选项

C#无法访问已释放的对象

ONVIF设备管理器如何获取摄像机的密码摘要?

通过 USB 编程访问多个网络摄像头

互斥和条件变量区别

再次重用 Deallocated Cursor 进行删除