我正在寻找一个使用V4L2在Linux中进行摄像头访问的简单示例.哪里可以找到它?尽可能简单.
谢谢,
Android Linux内核是否支持V4L或V4L2(适用于Linux的视频).如果没有,是否可以添加它?
我试图在Ubuntu 11.10上使用OpenCV 2.1同时从3台Logitech Webcam Pro 900设备流式传输图像.uvcvideo驱动程序会加载这些.
捕获两个设备工作正常,但有三个我遇到空间错误第三个:
libv4l2: error turning on stream: No space left on device
Run Code Online (Sandbox Code Playgroud)
我似乎遇到了这个问题: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..)
Run Code Online (Sandbox Code Playgroud)
并尝试捕获循环中的所有摄像机
cap0.retrieve(frame0);
Run Code Online (Sandbox Code Playgroud)
这适用于N = 2个摄像头.当我设置N = 3时,第三个窗口打开但没有图像出现,控制台被垃圾邮件充满了V4L2错误.同样,当我设置N = 2,并尝试打开第三个摄像头时说干酪(简单的网络摄像头捕获应用程序),这也不起作用.
现在变得很大但是:在通过启动三个实例尝试guvcview之后,我能够同时查看三个摄像头(在帧速率或相关方面没有问题),因此它似乎不是硬件问题.我认为我应该设置一些属性,但我不确定那是什么.我已经研究了MJPEG(这些相机似乎支持),但是没有成功设置这个属性,或者检测它们在运行时是从OpenCV启动它们的模式(yuyv?).
思考?
我在Linux(ubuntu 12.04)上通过python使用openCV,我有一个logitech c920,我想从中获取图像.奶酪能够获得高分辨率的帧,但每当我尝试使用openCV时,我只能获得640x480的图像.我试过了:
import cv
cam = cv.CaptureFromCAM(-1)
cv.SetCaptureProperty(cam,cv.CV_CAP_PROP_FRAME_WIDTH,1920)
cv.SetCaptureProperty(cam,cv.CV_CAP_PROP_FRAME_WIDTH,1080)
Run Code Online (Sandbox Code Playgroud)
但是这会在最后两行的每一行之后产生"0"的输出,并且当我随后通过以下方式获取帧时:
image = cv.QueryFrame(cam)
Run Code Online (Sandbox Code Playgroud)
生成的图像仍为640x480.
我尝试通过(在python之外)安装看似相关的工具:
sudo apt-get install libv4l-dev v4l-utils qv4l2 v4l2ucp
Run Code Online (Sandbox Code Playgroud)
我确实可以通过以下方式操纵相机的设置(再次,在python之外)
v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=1
v4l2-ctl --set-parm=30
Run Code Online (Sandbox Code Playgroud)
并观察:
v4l2-ctl -V
Run Code Online (Sandbox Code Playgroud)
确实表明某些事情发生了变化:
Format Video Capture:
Width/Height : 1920/1080
Pixel Format : 'H264'
Field : None
Bytes per Line : 3840
Size Image : 4147200
Colorspace : sRGB
Run Code Online (Sandbox Code Playgroud)
但是当我弹出python shell时,上面的代码表现与以前完全相同(在尝试设置属性并获得640x480的图像时打印零).
能够提高捕获的分辨率对我来说非常重要,所以我非常感谢任何人都可以提供的任何指针.
我正试图从/dev/video0带有Gstreamer 1.0 v4l2src元素的本地安装的Logitech C920相机捕获H264流.
v4l2-ctl --list-formats 表明相机能够提供H264视频格式:
# v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
...
Index : 1
Type : Video Capture
Pixel Format: 'H264' (compressed)
Name : H.264
...
Run Code Online (Sandbox Code Playgroud)
但管道
# gst-launch-1.0 -vvv v4l2src device=/dev/video0 ! video/x-h264, width=800, height=448, framerate=30/1 ! fakesink
一直给我not-negotiated (-4)错误:
/GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstFakeSink:fakesink0.GstPad:sink: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-h264, …Run Code Online (Sandbox Code Playgroud) 我在Ubuntu 12.04 64位上使用OpenCV 2.4.5.我希望能够设置Logitech C310网络摄像头的输入分辨率.相机支持最高1280x960(30fps),我可以在guvcview中以此分辨率观看视频.但OpenCV总是以640x480的速度获取视频.
在创建VideoCapture上限后立即尝试使用cap.set(CV_CAP_PROP_FRAME_WIDTH,1280)和cap.set(CV_CAP_PROP_FRAME_HEIGHT,960)更改分辨率无效; 在获取每个帧之前尝试立即设置它们会导致程序立即崩溃.我也不能用这种方法降低分辨率.我也收到错误"HIGHGUI ERROR:V4L/V4L2:VIDIOC_S_CROP".我认为这可能是相关的,因为它在创建VideoCapture时出现一次,并且当我尝试设置宽度和高度时出现一次(但奇怪的是,如果我尝试仅设置其中一个,则不会).
我知道我不是第一个遇到这个问题的人,但我还没有找到一个解决方案,经过谷歌搜索和搜索SO以及互联网上的其他地方(在我已经尝试过的许多事情中,无法获得的答案是这个StackOverflow问题:提高OpenCV中的摄像头捕获分辨率.这是OpenCV中的错误吗?如果是这样,这是一个相当明显的.
以下是展示问题的代码示例(只是OpenCV视频显示代码的修改版本):
#include <cv.h>
#include <highgui.h>
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
cap.set(CV_CAP_PROP_FRAME_WIDTH, 160);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 120);
Mat image;
namedWindow("Video", CV_WINDOW_AUTOSIZE);
while(1)
{
// cap.set(CV_CAP_PROP_FRAME_WIDTH, 160);
// cap.set(CV_CAP_PROP_FRAME_HEIGHT, 120);
cap >> image;
imshow("Video", image);
if(waitKey(10) == 99 ) break;
}
return
}
Run Code Online (Sandbox Code Playgroud)
实际上,如上所述,我得到两个"HIGHGUI ERROR",我得到一个640x480输出.我知道160x120是我的相机支持的分辨率v4l2-ctl --list-formats-ext.如果我取消注释while循环中两个注释掉的行,程序会立即崩溃.
这些可能是相关的或有可能的解决方案:http://answers.opencv.org/question/11427/decreasing-capture-resolution-of-webcam/,http://answers.opencv.org/question/30062/error-设置-分辨率的视频捕获装置/
我正在使用3个网络摄像头偶尔在OpenCV中拍摄快照.它们连接到相同的usb总线,由于usb带宽限制,它不能同时允许所有3个连接(降低分辨率允许最多2个同时连接,而且我没有更多的usb总线).
因此,每次我想拍摄快照时都必须切换网络摄像头连接,但这会在大约40个开关后导致内存泄漏.
这是我得到的错误:
libv4l2: error allocating conversion buffer
mmap: Cannot allocate memory
munmap: Invalid argument
munmap: Invalid argument
munmap: Invalid argument
munmap: Invalid argument
Unable to stop the stream.: Bad file descriptor
munmap: Invalid argument
munmap: Invalid argument
munmap: Invalid argument
munmap: Invalid argument
libv4l1: error allocating v4l1 buffer: Cannot allocate memory
HIGHGUI ERROR: V4L: Mapping Memmory from video source error: Invalid argument
HIGHGUI ERROR: V4L: Initial Capture Error: Unable to load initial memory buffers.
OpenCV Error: Bad flag (parameter …Run Code Online (Sandbox Code Playgroud) 我可能在这里有一些误解,所以请耐心等待.
我写了一个从相机中捕捉图像的程序.mmap正如我在V4L2文档中找到的那样,我在相机和我的应用程序之间共享内存.这非常有效.现在我的处理器(它是TI的DM3730)也有一个DSP.我想使用DSP,但它需要物理连续的内存.TI提供分配内存的驱动程序.我的问题是,现在我失去了很多时间将mmap的内存复制到物理连续的内存中.有没有办法告诉mmap它本身不应该分配内存,但我告诉mmap使用我分配的内存.
让你知道我在做什么(当然有很多代码缺失,但我非常接近V4L2文档.我希望这足以理解我的问题):
//reserve physical contiguous memory
dsp_buffer = Memory_alloc(buffer_length, &myParams);
...
//reserve memory for buffer, but not contiguous
buffers[n_buffers].start =
mmap (NULL , /* start anywhere */
buf.length,
PROT_READ | PROT_WRITE , /* required */
MAP_SHARED , /* recommended */
fd, buf.m.offset);
Run Code Online (Sandbox Code Playgroud)
之后,每当帧准备就绪时,我将内存从非连续内存复制到连续内存中.
...
//wait until frame is ready in memory
r = select (fd + 1, &fds, NULL, NULL, &tv);
...
//copy the memory over to the physically contiguous memory
memcpy(dsp_buffer,buffers[buf.index].start,size);
... …Run Code Online (Sandbox Code Playgroud) 我试图手动控制相机的曝光,但该设置只是短暂激活,但显然自动模式似乎仍然处于激活状态,正如我在相机图像上看到的那样。
我的相机有以下控件:
v4l2-ctl --list-ctrls-menus
brightness 0x00980900 (int) : min=-127 max=128 step=1 default=0 value=0
contrast 0x00980901 (int) : min=0 max=30 step=1 default=15 value=15
saturation 0x00980902 (int) : min=0 max=127 step=1 default=54 value=54
hue 0x00980903 (int) : min=-180 max=180 step=1 default=0 value=0
white_balance_temperature_auto 0x0098090c (bool) : default=1 value=1
gamma 0x00980910 (int) : min=20 max=250 step=1 default=88 value=88
gain 0x00980913 (int) : min=0 max=10 step=1 default=0 value=0
power_line_frequency 0x00980918 (menu) : min=0 max=2 default=1 value=1
0: Disabled
1: 50 Hz
2: 60 Hz …Run Code Online (Sandbox Code Playgroud) 除了2008年的这封电子邮件之外,我找不到V4L2的线程安全特性.它谈到了大内核锁,我猜现在已经消失了,对吧?
有没有人有这方面的最新信息?我可以ioctl(我正在考虑VIDIOC_DQBUF和VIDIOC_QBUF)来自多个线程的相同V4L2文件描述符而不进行序列化吗?上面引用的讨论确实表明答案是依赖于驾驶员的,但我想我还是会问.