当前位置: 首页 > 面试题库 >

一次从OpenCV中的两个摄像机捕获视频

鲜于勇
2023-03-14
问题内容

如何使用Python API使用OpenCV一次(或几乎)捕获两个或更多摄像机的视频?

我有三个可以进行视频流传输的网络摄像头,分别位于/ dev / video0,/ dev / video1和/ dev / video2。

以本教程为例,从单个摄像机捕获图像很简单:

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。在Macbooks上专门研究了这个问题,我发现在OSX和不同类型的相机上也遇到了这个问题的其他人。如果我访问iSight,则代码中的两个调用都会失败。


问题答案:

是的,您一定会受到USB带宽的限制。尝试以全分辨率从两个设备读取数据时,您可能会遇到错误:

libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
Traceback (most recent call last):
  File "p.py", line 7, in <module>
    assert ret1 # fails?!
AssertionError

然后,当您将分辨率降低到160x120时:

import cv2
cap0 = cv2.VideoCapture(0)
cap0.set(3,160)
cap0.set(4,120)
cap1 = cv2.VideoCapture(1)
cap1.set(3,160)
cap1.set(4,120)
ret0, frame0 = cap0.read()
assert ret0 # succeeds
ret1, frame1 = cap1.read()
assert ret1 # fails?!

现在看来可行!我敢打赌,两个摄像头都连接在同一个USB卡上。您可以运行lsusb命令来确保,它应该指示类似以下内容:

Bus 001 Device 006: ID 046d:081b Logitech, Inc. Webcam C310
Bus 001 Device 004: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 007: ID 046d:0990 Logitech, Inc. QuickCam Pro 9000
Bus 001 Device 005: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 003: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 002: ID 1058:0401 Western Digital Technologies, Inc. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

(请注意两个摄像机都在同一总线上。)如果可能,您可以在机器上添加另一个USB卡以获取更多带宽。我之前已经这样做过,以便在一台机器上以全分辨率运行多个凸轮。尽管那是带有可用主板插槽的塔式工作站,但是不幸的是,您可能没有在MacBook笔记本电脑上使用该选项。



 类似资料:
  • 我计划用网络摄像机捕捉视频,然后用opencv处理,最后在google原生客户端环境下用opencv naclport在网页上显示输出 我现在意识到的是 使用javascript中的MediaStreamTrack接口和 然后 将其编码为Base64字符串并发送到c模块以使用opencv进行处理, 在cpp模块中,将其解码回Mat图像并进行处理,最后将其发送回浏览器进行显示。 所以我想知道,在op

  • OpenCV无法在Linux上打开超过8个网络摄像头的视频捕获。这里有一个简单的例子: 对于我的设置(OpenCV 2.4.11,Ubuntu 14.04),比如说,有9个网络摄像头,opencap。py在前8个摄像头(0-7个)中成功,但在最后一个摄像头中成功 注意:正确列出了9个网络摄像头(/dev/video0、/dev/video8)。

  • 目前,我已经用Python实现了我的应用程序,可以通过USB读取相机帧。我使用Opencv,但对于分辨率为60fps和1920x1080的相机,我无法以这种速度捕捉图像。我尝试了一些东西:cv2。视频捕获(0,cv2.CAP_FFMPEG),但我无法捕获帧(捕获读取返回False)。请您提出任何解决方案或方法来提高整体速度,甚至在GPU中处理它们。 Opencv是从以下源代码构建的:

  • 我在从远程IP摄像头中抓取帧时遇到了问题。我的雇主希望在C#.NET(用于Windows)中完成,如果可能的话,使用轻量级的解决方案,即不使用任何庞大的框架。 该设备型号为DS-2CD2632F-I,它目前连接到我的局域网,相机的网络界面工作非常好。 我已经试用了几个流行的框架,例如AForge、EmguCV、OzekiSDK和directshow.net,但它们似乎都不起作用。特别是OzekiS

  • 在Android牛轧糖及以上版本中,从相机意图捕获图像的方法被改变了,下面的代码对我来说很好。 内容://com.example.demo.provider/external_files/camera/img_201712130_015646.jpg

  • 问题内容: 如何连续从摄像头捕获图像? 我想尝试对象识别(也许使用Java Media Framework)。 我当时正在考虑创建两个线程 一个线程: 节点1:捕获实时图像 节点2:将图片另存为“ 1.jpg” 节点3:等待5秒 节点4:重复… 其他线程: 节点1:等到捕获图像 节点2:使用“ 1.jpg”获取每个像素的颜色 节点3:将数据保存在数组中 节点4:重复… 问题答案: 此JavaCV实