OpenCV Python:cv2.VideoCapture只能找到3个摄像头中的2个,Windows Camera app找到全部

时间:2018-04-05 03:02:13

标签: python opencv camera

我尝试使用网络摄像头将3个实时捕获帧创建到我的笔记本电脑的USB集线器中。使用"相机"在Windows上的应用程序,我可以一次更改一个相机源并确认所有3个网络摄像头都正常工作。但是,我的OpenCV Python代码只能找到两个。

(关于USB的快速说明 - 它是USB 3.0集线器,笔记本电脑端口是USB 3,我甚至还有一个有源USB母对公电缆进入笔记本电脑,所以给出了这个和Windows应用程序工作,我一般信任硬件。)

下面我对cv2.VideoCapture(src)进行了一些原始测试,结果如下:

cams_test = 10
for i in range(0, cams_test):
    cap = cv2.VideoCapture(i)
    test, frame = cap.read()
    print("i : "+str(i)+" /// result: "+str(test))

第一个参数test返回True / False,具体取决于是否可以读取帧。结果:

i : 0 /// result: True
i : 1 /// result: True
i : 2 /// result: False
i : 3 /// result: False
i : 4 /// result: False
i : 5 /// result: False
i : 6 /// result: False
i : 7 /// result: False
i : 8 /// result: False
i : 9 /// result: False

与我测试的其他示例代码一样,只能注册2个网络摄像头并在Python中显示框架。 Windows 10相机应用程序允许我在所有3个工作和连接的网络摄像头源之间滚动。

我知道如果我使用有效的cv2.imshow(),我可以创建多个,例如3 +,cap帧。我的项目涉及这样做,以便从多个摄像头显示笔记本电脑上的实时USB网络摄像头。

任何帮助和建议表示赞赏;也可能对(基于Python的)替代解决方案感兴趣。干杯。

4 个答案:

答案 0 :(得分:4)

您的网络摄像头是否支持USB3?根据我在网络摄像头和OpenCV方面的实际经验,大多数普通相机只能以480 MBit / s的USB标准进行传输。您可以在一个USB通道上支持多少相机的确切细节取决于分辨率,帧速率和视频压缩技术。根据我的经验,使用30 fps的1080p彩色视频和H.264编码,只有一个摄像头流适合单个USB控制器。

一个简单的测试,看你是否带宽有限,将修改你的程序,以便在测试后显式关闭每个流(cap.release()),这样你的测试程序一次只能打开一个摄像头,如Windows相机应用程序。如果可行,那么您可能正在考虑带宽限制。

在Windows上调试视频捕获问题时,使用VLC打开相机流也很有用。 VLC可以枚举DirectShow中可用的所有摄像头,这与OpenCV的VideoCapture默认使用的API相同。您还可以启动多个VLC实例以尝试同时进行流。

如果单击“高级选项”然后选中“设备属性”,VLC将显示可以通过DirectShow调整哪些设置(曝光,聚焦等)。这些设置通常可以通过VideoCapture.set()在OpenCV中访问。

答案 1 :(得分:3)

拥有两个视频输入设备并不会自动表示他们的ID为0和10.尝试通过增加到大约500或更多而不是10来访问所有摄像头

cams_test = 500
for i in range(0, cams_test):
    cap = cv2.VideoCapture(i)
    test, frame = cap.read()
    if test:
        print("i : "+str(i)+" /// result: "+str(test))

我认为你只是在测试

答案 2 :(得分:2)

1)关于cv2 ......嗯,还有其他实例/替代方案吗?也许第三个凸轮绑定到其他实例而不是cv2

2)你是否尝试从-1而不是0开始循环(范围)?

3)如果该方法都没有帮助您,我建议您转到Device Manager并暂时禁用单个网络摄像头,然后再次运行您的脚本并查看更改。之后,ENABLE网络摄像头,看看有什么变化。 (在最糟糕的情况下,您可能会安装/重新安装特定的网络摄像头,然后Windows可能会正确解决它们。)

答案 3 :(得分:1)

首先,我们必须测试您的网络摄像头是否可以连接到OPENCV。

仅连接一个网络摄像头,并使用cv2.VideoCapture(0)运行您的程序。参数0表示连接了一个摄像头。 如果您的所有网络摄像头都没问题,那么它将是索引问题,有一些代码会find the deviceID assigned to the cam

如果一些网络摄像头不幸失败了,那就很难了。

  

在这种情况下,您必须创建自己的函数,使用SDK抓取并将图像写入cv :: Mat。