我在一台Windows10计算机上使用python OpenCV来处理来自USB相机的帧。当在PCIe USB卡上运行相机时,VideoCapture.read()大部分时间返回适当大小的黑色帧,并偶尔读取正确的图像。
我已经测试过在USB集线器上运行摄像头,发现集线器会导致连接错误。由于这个原因,我开始在USB3.0 PCIe卡上运行摄像头,它应该有足够的速度从所有的相机中收集帧(特别是降低帧速率没有任何改善)。
我的代码如下所示:
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值)帧。
发布于 2019-10-09 19:47:14
我找到了一个答案,为了文档起见,我将在这里添加它。这有点超出了我的经验范围,所以请随意评论不恰当的行话或错误的假设。
OpenCV在USB控制器上锁定一个通道,以便与VideoCapture一起使用。任何其他试图通过该通道进行通信的VideoCapture对象都会出现通信问题(但只要该通信路径具有带宽,其他非OpenCV设备就不会出现问题)。一个给定的主板有这么多的USB连接通道。我拥有的PCIe卡,虽然有4个端口,但只增加了一个通道。您可以购买添加多个频道的PCIe卡。您必须确保没有任何VideoCapture句柄使用相同的通道。
在玩这个游戏时,我想要一种方法来识别当我插入相机时USB端口使用的是什么通道,这样我就可以识别相机在插入时是否会造成问题。我不确定这样做的最佳方法,但我确实注意到,如果您转到(Windows10)设备管理器->通用串行总线控制器-> -> Details选项卡->属性:位置路径,括号中的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设备不匹配,则不会出现问题。
当然,您总是可以切换到以太网相机的多摄像机设置,我认为这是目前推荐的方法。但我把这个留给任何需要它的人。
https://stackoverflow.com/questions/58294283
复制相似问题