python - 一次从 OpenCV 中的两个摄像头捕获视频

标签 python opencv camera

如何使用 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/

相关文章:

python - 假设正数时 Sympy 中可能存在不一致

python - 如何保存 token 以便在 O365 python 库中重复使用?

python - Scrapy中的爬行顺序

c++ - 过滤时进行操作

ios - AVCapturePhotoOutput 没有成员 'captureStillImageAsynchronously'

闪光灯允许按钮无法按下

python - 创建类实例并将其排列到网格中

python - Opencv/python - 如何在图像处理后获取检测区域的坐标

android - 使用 FAST 检测可以更快地进行 SURF 描述?

ios 8 uiimagepicker 相机方向问题