首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux上使用OpenCV捕获多个网络摄像头(uvcvideo)

在Linux上使用OpenCV捕获多个网络摄像头(uvcvideo)
EN

Stack Overflow用户
提问于 2012-03-20 13:29:28
回答 7查看 27.6K关注 0票数 15

我正在尝试使用Ubuntu11.10上的OpenCV 2.1同时传输来自3台罗技Webcam Pro900设备的图像。为这些加载uvcvideo驱动程序。

捕获两个设备运行良好,但是对于三个设备,我遇到了第三个设备的空间不足错误:

代码语言:javascript
复制
libv4l2: error turning on stream: No space left on device

我似乎遇到了这个问题:http://renoirsrants.blogspot.com.au/2011/07/multiple-webcams-on-zoneminder.html和我尝试过quirks=128 (或几乎任何其他2的幂值)的技巧,但都无济于事。我还在另一台有两个USB2.0集线器的机器上进行了尝试,将两个摄像头连接到一个摄像头,将第三个摄像头连接到第二个摄像头,结果也出现了同样的问题。我的初始化大致如下(使用N个摄像头,因此结果实际上被放入STL向量中):

代码语言:javascript
复制
cv::VideoCapture cap0(0); //(0,1,2..)

并尝试将循环中的所有摄像机捕获为

代码语言:javascript
复制
cap0.retrieve(frame0);

这对N=2相机很有效。当我设置N=3时,第三个窗口打开,但是没有图像出现,控制台充满了V4L2错误的垃圾邮件。类似地,当我设置N=2,并尝试在Cheese (简单的网络摄像头捕获应用程序)中打开第三个摄像头时,这也不起作用。

现在出现了一个大问题:通过启动三个实例来尝试guvcview之后,我能够同时查看三个摄像头(在帧率或相关方面没有任何问题),所以它似乎不是硬件问题。我想我应该设置一些属性,但我不确定是什么。我研究过MJPEG (这些摄像头似乎支持MJPEG),但没有成功地设置这个属性,也没有检测到是哪种模式(yuyv?)如果我从OpenCV启动它们,它们就会运行。

有什么想法?

EN

回答 7

Stack Overflow用户

发布于 2014-05-27 12:33:15

我也有这个问题,我有一个解决方案,可以让我在640x480的mjpeg压缩下捕捉2个相机。我使用的是一个创造性的"Live Cam Sync HD VF0770“,它错误地报告了其带宽要求。quirks=128修复适用于320x240未压缩视频。但是对于压缩(mjpg)格式,quirks=128不起作用(对于压缩格式它什么也不做)。

为了解决这个问题,我修改了uvc驱动,如下所示:

下载内核源代码

代码语言:javascript
复制
mkdir -p ~/Software/kernel-git
cd ~/Software/kernel-git
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git checkout v3.2
# NOTE: `uname -r`  shows me my current kernel is 3.2.0-60-generic
# For a different kernel use a different tag

复制uvc目录:

代码语言:javascript
复制
mkdir -p ~/Software/uvcvideo_driver
cd ~/Software/uvcvideo_driver
#cp -a ~/Software/kernel-git/linux/drivers/media/usb/uvc .
cp ~/Software/kernel-git/linux/drivers/media/video/uvc .

修改Makefile

代码语言:javascript
复制
cd ~/Software/uvcvideo_driver/uvc
vi Makefile

        obj-m += aauvcvideo.o
        aauvcvideo-objs  := uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ctrl.o \
              uvc_status.o uvc_isight.o
        all:
          make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

        clean:
          make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

压缩时强制带宽为0x400。

代码语言:javascript
复制
cd ~/Software/uvcvideo_driver/uvc
vw uvc_video.c
Find the uvc_fixup_video_ctrl() function.  At the end of the function add:
      if (format->flags & UVC_FMT_FLAG_COMPRESSED) {
        ctrl->dwMaxPayloadTransferSize = 0x400;
      }

构建aauvcvideo模块:

代码语言:javascript
复制
make

移除旧模块并插入新模块:

代码语言:javascript
复制
sudo rmmod uvcvideo
sudo insmod ./aauvcvideo.ko quirks=128

在两个不同的窗口中运行gucview两次并压缩以进行测试

代码语言:javascript
复制
guvcview --device=/dev/video1 --format=mjpg --size=640x480
guvcview --device=/dev/video2 --format=mjpg --size=640x480

祝你好运!-Acorn

票数 14
EN

Stack Overflow用户

发布于 2012-04-27 23:37:39

我在使用三个罗技quickcam pro9000摄像头(使用ubuntu)时遇到了这个问题。我可以从二开始读,但不能从三开始。在我的例子中,我没有使用opencv,而是使用内存映射IO通过V4L2直接访问摄像头。简单地说,没有足够的USB带宽来分配三个缓冲区。

然而,我是在未压缩的帧中阅读的。一旦我将格式转换为MJPEG,数据就足够小了,我可以从三个摄像头读取。我使用libjpeg解码MJPEG流。

我还没有研究如何使用OpenCV更改图像格式,但我知道它需要MJPEG才能适应所有这些数据。

在我切换到MJPEG之前,我花了很多时间一次一个地访问每个摄像头,在切换到下一个之前流式传输一个帧。不推荐!

票数 10
EN

Stack Overflow用户

发布于 2013-05-31 14:53:39

视频捕获设备的驱动程序最有可能报告存在USB带宽争用。检查像素格式是否为YUYV,恰好是未压缩的。相反,如果像素格式为MJPG (压缩),则可以在同一USB通道上具有多个设备。

代码语言:javascript
复制
v4l2-ctl -d /dev/video0 --list-formats

输出将如下所示:

代码语言:javascript
复制
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : 16bpp YUY2, 4:2:2, packed

以下是可能的解决方案:

  1. 使用不同制造商的捕获设备,因此加载的驱动程序不同。通常,处理多个设备的相同驱动程序需要处理带宽effectively.
  2. Use,如果可用于连接第二个USB视频捕获设备,则需要处理PCI USB扩展卡。当我尝试连接加载了驱动程序cx231xx的AVerMedia DVD EZMaker 7时,这个变通方法对我非常有效。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9781770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档