从 2 个摄像头捕获(OpenCV、Python)

Posted

技术标签:

【中文标题】从 2 个摄像头捕获(OpenCV、Python)【英文标题】:Capturing From 2 Cameras (OpenCV, Python) [duplicate] 【发布时间】:2012-01-28 22:22:23 【问题描述】:

所以我试图从 openCV(python 和 windows 7)中的两个摄像头捕获。我从一台相机拍摄得很好,你还会注意到我正在对图像做一些时髦的东西,但这没关系。这是尝试使用两个的代码

import cv
import time
cv.NamedWindow("camera", 1)
cv.NamedWindow("camera2", 1)
capture = cv.CaptureFromCAM(0)
capture2 = cv.CaptureFromCAM(1)
while True:
    img = cv.GetMat(cv.QueryFrame(capture))
    img2 = cv.GetMat(cv.QueryFrame(capture2))
    dst_image = cv.CloneMat(img)
    dst_image2 = cv.CloneMat(img2)
    cv.ConvertScale(img, dst_image, 255, -59745.0)
    cv.ConvertScale(img2, dst_image2, 255, -59745.0)
    cv.ShowImage("camera", dst_image)
    cv.ShowImage("camera2", dst_image2)
    if cv.WaitKey(10) == 27:
        cv.DestroyWindow("camera")
        cv.DestroyWindow("camera2")
        break

相当简单。然而它不会工作。在尝试从第二个摄像头(循环中的第二行代码)创建矩阵时,我被告知捕获为空。我使用的相机是罗技,型号相同。

旁注:我也找不到用于计算在 python 中连接的摄像头的命令,所以如果有人可以推荐我,我将不胜感激。 --阿什利

编辑: 知道 Windows 经常提示我选择我想使用的相机也可能很有用。我似乎无法避免这种行为。此外,我下载了一些安全软件,可以同时成功运行两个摄像头。它不是开源的或类似的东西。很明显,这是可能的。

【问题讨论】:

签名被移除,请参考FAQ。 【参考方案1】:

如果您使用 windows 进行编码,为什么不尝试 VideoCapture 模块。它非常易于使用,并提供 PIL 图像作为输出。您可以稍后将其更改为二维数组。

【讨论】:

我有很多理由,尤其是在未来,我更愿意使用 openCV。不过谢谢。 好吧,现在绝望了。设置 VideoCapture 并从一台相机保存图像,但我对如何做 2 有点困惑。有什么例子可以指点我吗?【参考方案2】:

这是一个小代码:

import VideoCapture
cam0 = VideoCapture.Device(0)
cam1 = VideoCapture.Device(1)
im0 = cam0.getImage()
im1 = cam1.getImage()

im0 和 im1 是 PIL 图像。您现在可以使用 scipy 将其转换为数组,如下所示:

import scipy as sp
imarray0 = asarray(im0)
imarray1 = asarray(im1)

imarray0 和 imarray1 是 numpy 二维数组,您可以进一步使用 openCV 函数。

【讨论】:

所以这有助于我更轻松地诊断问题。事实证明,它的驱动程序不会让两个摄像头同时与计算机对话。它使第一台相机很好。第二个摄像头尝试连接,指示灯闪烁,但从未成功。再次感谢,我想我现在会尝试两个不同的相机,然后看看我是否可以使用另一个品牌并做两个相同的。 太棒了,你已经能够破解麻烦。还告诉我你是否知道如何枚举所有可能连接到计算机的网络摄像头【参考方案3】:

我在使用两个 lifecam studio 网络摄像头时遇到了同样的问题。经过一番阅读,我认为这个问题与 USB 总线上的带宽过载有关。如果我 1.) 降低分辨率(每个 320 x 240)或 2.) 降低帧速率(~99 毫秒 @ 800 x 600),两个相机都开始工作。附件是让我工作的代码:

import cv

cv.NamedWindow("Camera 1")
cv.NamedWindow("Camera 2")
video1 = cv.CaptureFromCAM(0)
cv.SetCaptureProperty(video1, cv.CV_CAP_PROP_FRAME_WIDTH, 800)
cv.SetCaptureProperty(video1, cv.CV_CAP_PROP_FRAME_HEIGHT, 600)

video2 = cv.CaptureFromCAM(1)
cv.SetCaptureProperty(video2, cv.CV_CAP_PROP_FRAME_WIDTH, 800)
cv.SetCaptureProperty(video2, cv.CV_CAP_PROP_FRAME_HEIGHT, 600)

loop = True
while(loop == True):
    frame1 = cv.QueryFrame(video1)
    frame2 = cv.QueryFrame(video2)
    cv.ShowImage("Camera 1", frame1)
    cv.ShowImage("Camera 2", frame2)
    char = cv.WaitKey(99)
    if (char == 27):
        loop = False

cv.DestroyWindow("Camera 1")
cv.DestroyWindow("Camera 2")

【讨论】:

以上是关于从 2 个摄像头捕获(OpenCV、Python)的主要内容,如果未能解决你的问题,请参考以下文章

洞察使用 python 和 OpenCV 与 VideoCapture 进行多网络摄像头捕获

[OpenCV-Python] OpenCV 中的 Gui 视频

无法在 OpenCV 2.4.7 中从摄像头捕获视频

OpenCV 捕获多个 RTSP 流 - Python

python opencv:摄像头捕获图像

使用 OpenCV 和 Python-2.7 进行屏幕截图