首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在返回黑框的OpenCV卡上使用多个摄像头修复PCIe?

如何在返回黑框的OpenCV卡上使用多个摄像头修复PCIe?
EN

Stack Overflow用户
提问于 2019-10-08 21:23:49
回答 1查看 375关注 0票数 0

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

我已经测试过在USB集线器上运行摄像头,发现集线器会导致连接错误。由于这个原因,我开始在USB3.0 PCIe卡上运行摄像头,它应该有足够的速度从所有的相机中收集帧(特别是降低帧速率没有任何改善)。

我的代码如下所示:

代码语言:javascript
复制
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值)帧。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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设备不匹配,则不会出现问题。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58294283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档