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

2024-05-23 20:29:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建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个工作和连接的网络摄像头源之间滚动。

我知道我可以创建多个,比如3+,cv2.imshow()帧,如果我使用起作用的cap。我的项目包括这样做,以显示实时USB摄像头从多个摄像头在笔记本电脑上的饲料。

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


Tags: 代码test网络falsetrue应用程序windowsresult
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))

我想你只是在测试

你的摄像头支持USB3吗?根据我对网络摄像头和OpenCV的实际经验,大多数常见的摄像头只能以480mbit/s的速度在USB2标准上进行传输。一个USB通道可以支持多少个摄像头的确切细节取决于分辨率、帧速率和视频压缩技术。以我的经验,1080p彩色视频每秒30帧,H.264编码,只有一个摄像头流适合一个USB控制器。

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

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

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

1)关于cv2。。。嗯,还有其他的例子/选择吗?也许第三个cam绑定到其他实例而不是cv2

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

3)如果没有任何方法对您有帮助,我建议您转到Device Manager,暂时禁用单个网络摄像头,然后再次运行脚本并查看更改。之后,启用网络摄像头,看看有什么变化。(在最坏的情况下,您可能会插入/重新插入特定的网络摄像头,而不是启用/禁用,然后windows可能会正确解析它们)。

相关问题 更多 >