如何使用返回黑色框架的PCIe卡上的多个摄像机修复OpenCV?

时间:2019-10-08 21:23:49

标签: python opencv

我正在Windows 10计算机上使用python OpenCV处理来自USB摄像机的帧。使用PCIe USB卡运行摄像机时,VideoCapture.read()大部分时间会返回适当大小的黑框,并偶尔读取正确的图像。

我已经测试过在USB集线器上运行相机,发现集线器会导致连接错误。因此,我转而使用USB 3.0 PCIe卡运行摄像机,该USB 3.0 PCIe卡应具有足够的速度来收集所有摄像机中的帧(特别是通过降低帧速率无法带来任何改善这一事实表明)。 / p>

我的代码如下:

import cv2

code_should_be_running = True  # boolean to shut the loop down externally
camera = cv2.VideoCapture(0)  # OpenCV camera connection handle


while code_should_be_running:
    read_success, frame = camera.read()  # where the frames are returned black

    if read_success:
        processed_frame = process_frame(frame)  # OpenCV-based processing of frame
        cv2.imshow('Window Name', processed_frame)
        cv2.waitKey(1)

我很肯定在python级别上这不是问题(尽管我认为解决方法仍然可以在此级别)。这是因为在单步执行代码时,仅在代码中的注释所指示的位置将帧返回为黑色,而处理与此无关。

我希望这与OpenCV处理与USB摄像机的连接保持方式有关。但是我认为PCIe卡将扩展OpenCV同时使用摄像机的能力。带宽不会成为问题,因为PCIe卡的额定帧数超过了这些摄像机全速产生的帧数。另外,当我测试USB集线器时,我会得到实际的连接错误,而这并没有给出连接错误,它只会返回黑色(0个值)帧。

1 个答案:

答案 0 :(得分:0)

我找到了答案,出于文档目的,我将在此处添加答案。这有点超出我的经验范围,所以请随意评论不正确的术语或错误的假设。

OpenCV锁定USB控制器上的通道以与VideoCapture一起使用。尝试通过该通道进行通信的任何其他VideoCapture对象都将出现通信问题(尽管其他非OpenCV设备不会,只要该通信路径具有带宽)。给定的主板具有许多用于USB连接的通道。我拥有的PCIe卡虽然有4个端口,但只添加了一个通道。您可以购买添加多个通道的PCIe卡。您必须确保没有VideoCapture句柄使用相同的频道。

在玩耍时,我想要一种方法来确定在插入相机时USB端口正在使用的通道,以便可以确定相机在插入电源时是否会引起问题。我不确定最好的方法,但我注意到的一件事是,如果您转到(Windows 10)设备管理器->通用串行总线控制器->->详细信息选项卡->属性:位置路径括号中的PCI值将是唯一的使用USB控制器。

例如:PCIROOT(0)#PCI( 1C00 )#PCI(0000)#PCI(0100)#PCI(0000)#PCI(0400)#PCI(0000)#PCI(0100) )#PCI(0000)#USBROOT(0)#USB(3)#USB(5)

因此,如果该值与任何其他VideoCapture设备都不匹配,则不会有问题。

当然,您始终可以切换到以太网摄像机进行多摄像机设置,我认为这是当前推荐的方法。但是我把这个留给任何需要它的人。