我尝试使用网络摄像头将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的)替代解决方案感兴趣。干杯。
答案 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。