【发布时间】:2015-06-22 06:00:43
【问题描述】:
如何使用 Python API 使用 OpenCV 同时(或几乎)从两个或多个摄像头捕获视频?
我有三个网络摄像头,都可以进行视频流传输,位于 /dev/video0、/dev/video1 和 /dev/video2。
以tutorial 为例,从单个摄像头捕获图像很简单:
import cv2
cap0 = cv2.VideoCapture(0)
ret0, frame0 = cap0.read()
cv2.imshow('frame', frame0)
cv2.waitKey()
这很好用。
但是,如果我尝试初始化第二个摄像头,尝试从中 read() 返回 None:
import cv2
cap0 = cv2.VideoCapture(0)
cap1 = cv2.VideoCapture(1)
ret0, frame0 = cap0.read()
assert ret0 # succeeds
ret1, frame1 = cap1.read()
assert ret1 # fails?!
为了确保我不会不小心给 OpenCV 一个错误的相机索引,我单独测试了每个相机索引,它们都可以自己工作。例如
import cv2
#cap0 = cv2.VideoCapture(0)
cap1 = cv2.VideoCapture(1)
#ret0, frame0 = cap0.read()
#assert ret0
ret1, frame1 = cap1.read()
assert ret1 # now it works?!
我做错了什么?
编辑:我的硬件是运行 Ubuntu 的 Macbook Pro。专门研究 Macbook 上的问题,我发现其他人也遇到了这个问题,无论是在 OSX 上还是在不同类型的相机上。如果我访问 iSight,我的代码中的两个调用都会失败。
【问题讨论】:
-
如果您更改 videoCapture 语句的顺序,是否会在其他通道上发生错误?
-
这对我来说似乎在 Windows 上运行良好。
-
相机是集成的还是USB的?如果they're on the same serial bus,它们可能无法同时运行,因为串行总线是串行的。
-
@Cerin,这是一个饱和问题。 usb2 几乎无法处理单个网络摄像头的吞吐量,如果要运行更多摄像头,则需要更多(独立)USB 控制器。普通电脑一般是一个在前面,一个在后面
-
@berak,我说得太早了。事实证明,当我将
read()设置为 160x120 时,它确实适用于多台摄像机。我想这完全是带宽问题。