我正在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个值)帧。
答案 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设备都不匹配,则不会有问题。
当然,您始终可以切换到以太网摄像机进行多摄像机设置,我认为这是当前推荐的方法。但是我把这个留给任何需要它的人。