在Linux上使用OpenCV捕获多个网络摄像头(uvcvideo)
我试图在Ubuntu 11.10上使用OpenCV 2.1同步传输3个Logitech Webcam Pro 900设备的图像。 uvcvideo驱动程序为这些加载。
捕获两个设备工作正常,但是有三个我遇到第三个空间不足的错误:
libv4l2: error turning on stream: No space left on device
我似乎遇到了这个问题:http://renoirsrants.blogspot.com.au/2011/07/multiple-webcams-on-zoneminder.html我试图做怪癖= 128(或几乎任何其他权力的两个价值)技巧,但无济于事。 我还尝试过使用两个USB 2.0集线器的另一台计算机,并将两台摄像机连接到一台,将第三台摄像机连接到第二台,导致同样的问题。 我大致初始化如下(使用N个摄像头,结果实际上放入STL向量中):
cv::VideoCapture cap0(0); //(0,1,2..)
并试图捕获一个循环中的所有相机
cap0.retrieve(frame0);
这适用于N = 2个相机。 当我设置N = 3时,第三个窗口打开,但没有图像出现,控制台被垃圾邮件充满V4L2错误。 同样,当我设置N = 2,并尝试打开奶酪(简单的摄像头捕捉应用程序)中的第三个摄像头时,这也不起作用。
现在来了,但是:通过启动三个实例来尝试guvcview之后,我能够一次查看三个摄像头(在帧速率或相关方面没有问题),所以它似乎不是硬件问题。 我认为我应该设置一些属性,但我不确定那是什么。 我研究过MJPEG(这些相机似乎支持),但是没有成功设置这个属性,或者检测到它们运行在哪种模式(yuyv?),如果我从OpenCV启动它们。
思考?
我有这个确切的问题,使用三个logitech quickcam pro 9000相机(使用Ubuntu)。 我可以从两个,但不是三个阅读。 在我的情况下,我没有使用opencv,而是直接使用内存映射IO通过V4L2访问摄像机。 简而言之,没有足够的USB带宽来分配三个缓冲区。
然而,我正在阅读未压缩的帧。 只要我将格式转换为MJPEG,数据就足够小,我可以从三台摄像机读取数据。 我用libjpeg来解码MJPEG流。
我还没有研究过如何使用OpenCV来改变图像格式,但我知道它需要是MJPEG来适应所有的数据。
在我切换到MJPEG之前,我花了很多时间试图逐个访问每个摄像头,在切换到下一个摄像头之前将一帧流式传输。 不建议!
我也有这个问题,并有一个解决方案,让我用640 * 480采集mjpeg压缩的2台摄像机。 我使用的是Creative“Live Cam Sync HD VF0770”,它错误地报告了它的带宽需求。 怪癖= 128修复适用于320x240未压缩的视频。 但对于压缩(mjpg)格式,怪异= 128不起作用(它对压缩格式没有任何作用)。
为了解决这个问题,我修改了uvc驱动程序,如下所示:
下载内核源码
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 dir:
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
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。
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模块:
make
删除旧模块并插入新模块:
sudo rmmod uvcvideo
sudo insmod ./aauvcvideo.ko quirks=128
在两个不同的窗口中运行gucview两次压缩测试
guvcview --device=/dev/video1 --format=mjpg --size=640x480
guvcview --device=/dev/video2 --format=mjpg --size=640x480
祝你好运! -Acorn
视频捕获设备的驱动程序最有可能报告USB带宽争用情况。 检查像素格式是否为YUYV,这恰好是未压缩的。 相反,如果像素格式为MJPG(压缩),则可能在同一个USB通道上有多个设备。
v4l2-ctl -d /dev/video0 --list-formats
输出结果如下所示:
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'YUYV'
Name : 16bpp YUY2, 4:2:2, packed
以下是可能的解决方案:
上一篇: Capturing multiple webcams (uvcvideo) with OpenCV on Linux