我正在尝试使用Ubuntu11.10上的OpenCV 2.1同时传输来自3台罗技Webcam Pro900设备的图像。为这些加载uvcvideo驱动程序。
捕获两个设备运行良好,但是对于三个设备,我遇到了第三个设备的空间不足错误:
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向量中):
cv::VideoCapture cap0(0); //(0,1,2..)并尝试将循环中的所有摄像机捕获为
cap0.retrieve(frame0);这对N=2相机很有效。当我设置N=3时,第三个窗口打开,但是没有图像出现,控制台充满了V4L2错误的垃圾邮件。类似地,当我设置N=2,并尝试在Cheese (简单的网络摄像头捕获应用程序)中打开第三个摄像头时,这也不起作用。
现在出现了一个大问题:通过启动三个实例来尝试guvcview之后,我能够同时查看三个摄像头(在帧率或相关方面没有任何问题),所以它似乎不是硬件问题。我想我应该设置一些属性,但我不确定是什么。我研究过MJPEG (这些摄像头似乎支持MJPEG),但没有成功地设置这个属性,也没有检测到是哪种模式(yuyv?)如果我从OpenCV启动它们,它们就会运行。
有什么想法?
发布于 2014-05-27 12:33:15
我也有这个问题,我有一个解决方案,可以让我在640x480的mjpeg压缩下捕捉2个相机。我使用的是一个创造性的"Live Cam Sync HD VF0770“,它错误地报告了其带宽要求。quirks=128修复适用于320x240未压缩视频。但是对于压缩(mjpg)格式,quirks=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目录:
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
发布于 2012-04-27 23:37:39
我在使用三个罗技quickcam pro9000摄像头(使用ubuntu)时遇到了这个问题。我可以从二开始读,但不能从三开始。在我的例子中,我没有使用opencv,而是使用内存映射IO通过V4L2直接访问摄像头。简单地说,没有足够的USB带宽来分配三个缓冲区。
然而,我是在未压缩的帧中阅读的。一旦我将格式转换为MJPEG,数据就足够小了,我可以从三个摄像头读取。我使用libjpeg解码MJPEG流。
我还没有研究如何使用OpenCV更改图像格式,但我知道它需要MJPEG才能适应所有这些数据。
在我切换到MJPEG之前,我花了很多时间一次一个地访问每个摄像头,在切换到下一个之前流式传输一个帧。不推荐!
发布于 2013-05-31 14:53:39
视频捕获设备的驱动程序最有可能报告存在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以下是可能的解决方案:
https://stackoverflow.com/questions/9781770
复制相似问题