如何使用 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()
返回无:
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,我的代码中的两个调用都会失败。
最佳答案
使用 OPENCV 和两个标准 USB 摄像头,我能够使用多线程来完成这项工作。本质上,定义一个打开 opencv 窗口和 VideoCapture 元素的函数。然后,创建两个线程,将相机 ID 和窗口名称作为输入。
import cv2
import threading
class camThread(threading.Thread):
def __init__(self, previewName, camID):
threading.Thread.__init__(self)
self.previewName = previewName
self.camID = camID
def run(self):
print "Starting " + self.previewName
camPreview(self.previewName, self.camID)
def camPreview(previewName, camID):
cv2.namedWindow(previewName)
cam = cv2.VideoCapture(camID)
if cam.isOpened(): # try to get the first frame
rval, frame = cam.read()
else:
rval = False
while rval:
cv2.imshow(previewName, frame)
rval, frame = cam.read()
key = cv2.waitKey(20)
if key == 27: # exit on ESC
break
cv2.destroyWindow(previewName)
# Create two threads as follows
thread1 = camThread("Camera 1", 1)
thread2 = camThread("Camera 2", 2)
thread1.start()
thread2.start()
学习如何在 Python 中线程化的重要资源:https://www.tutorialspoint.com/python/python_multithreading.htm
关于python - 一次从 OpenCV 中的两个摄像头捕获视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664399/