导航:首页 > 操作系统 > v4llinux

v4llinux

发布时间:2022-11-15 01:26:26

Ⅰ 如何利用Video4linux获取摄像头数据

1. 摄像头的安装

在Linux下常用的摄像头驱动是spca5xx。这个网站还给出了这款驱动支持的摄像头的种类。另外,ov511芯片直接就支持Linux,使用者款芯片的摄像头有网眼V2000。我使用的是网眼V2000的摄像头,和Z-Star
301p+现代7131R芯片的摄像头。后一种需要spca5xx的驱动。关于spca5xx的安装方法,网上有很多介绍,这里就不说了。

2. 摄像头的调试

安装好摄像头后,为了测试摄像头能否正常工作,可以用一下软件。比较着名的是xawtv,在网上搜以下可以下载到。安装好后,打开xawtv则可以调试摄像头。

3. Video4Linux 编程获取数据

现有的video4linux有两个版本,v4l和v4l2。本文主要是关于v4l的编程。利用v4l API获取视频图像一般有以下几步:

a> 打开设备

b> 设置设备的属性,比如图像的亮度,对比度等等

c> 设定传输格式和传输方式

d> 开始传输数据,一般是一个循环,用以连续的传输数据

e> 关闭设备

下面具体介绍v4l编程的过程。首先指出,在video4linux编程时要包含头文件,其中包含了video4linux的数据结构和函数定义。

1)v4l的数据结构

在video4linux API中定义了如下数据结构,详细的数据结构定义可以参考v4l API的文档,这里就编程中经常使用的数据结构作出说明。

首先我们定义一个描述设备的数据结构,它包含了v4l中定义的所有数据结构:
typedef struct
_v4ldevice
{int fd;//设备号
struct video_capability capability;
struct
video_channel channel[10];
struct video_picture picture;
struct video_clip
clip;
struct video_window window;
struct video_capture capture;
struct
video_buffer buffer;
struct video_mmap mmap;
struct video_mbuf
mbuf;
struct video_unit unit;
unsigned char
*map;//mmap方式获取数据时,数据的首地址
pthread_mutex_t mutex;
int frame;
int
framestat[2];
int overlay;
}v4ldevice;
下面解释上面这个数据结构中包含的数据结构,这些结构的定义都在中。
* struct
video_capability
name[32] Canonical name for this interface
type Type of
interface
channels Number of radio/tv channels if appropriate
audios
Number of audio devices if appropriate
maxwidth Maximum capture width in
pixels
maxheight Maximum capture height in pixels
minwidth Minimum capture
width in pixels
minheight Minimum capture height in pixels

这一个数据结构是包含了摄像头的属性,name是摄像头的名字,maxwidth maxheight是摄像头所能获取的最大图像大小,用像素作单位。

在程序中,通过ioctl函数的VIDIOCGCAP控制命令读写设备通道已获取这个结构,有关ioctl的使用,比较复杂,这里就不说了。下面列出获取这一数据结构的代码:
int v4lgetcapability(v4ldevice *vd)
{
if(ioctl(vd->fd,
VIDIOCGCAP, &(vd->capability)) < 0)
{
v4lperror("v4lopen:VIDIOCGCAP");
return -1;
}
return 0;
}
*
struct video_picture
brightness Picture brightness
hue Picture hue (colour
only)
colour Picture colour (colour only)
contrast Picture
contrast
whiteness The whiteness (greyscale only)
depth The capture depth
(may need to match the frame buffer depth)
palette Reports the palette that
should be used for this image

这个数据结构主要定义了图像的属性,诸如亮度,对比度,等等。这一结构的获取通过ioctl发出VIDIOCGPICT控制命令获取。
* struct video_mbuf
size The number of bytes to
map
frames The number of frames
offsets The offset of each frame

这个数据结构在用mmap方式获取数据时很重要:

size表示图像的大小,如果是640*480的彩色图像,size=640*480*3

frames表示帧数

offsets表示每一帧在内存中的偏移地址,通过这个值可以得到数据在图像中的地址。

得到这个结构的数据可以用ioctl的VIDIOCGMBUF命令。源码如下:
int v4lgetmbuf(v4ldevice
*vd)
{
if(ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf))<0)
{
v4lperror("v4lgetmbuf:VIDIOCGMBUF");
return -1;
}
return
0;
}

而数据的地址可以有以下方式计算:
unsigned char
*v4lgetaddress(v4ldevice *vd)
{
return (vd->map +
vd->mbuf.offsets[vd->frame]);
}

2)获取影像mmap方式。

在video4Linux下获取影像有两种方式:overlay和mmap。由于我的摄像头不支持overlay方式,所以这里只谈mmap方式。

mmap方式是通过内存映射的方式获取数据,系统调用ioctl的VIDIOCMCAPTURE后,将图像映射到内存中,然后可以通过前面的v4lgetmbuf(vd)函数和v4lgetaddress(vd)函数获得数据的首地址,这是李可以选择是将它显示出来还是放到别的什么地方。

下面给出获取连续影像的最简单的方法(为了简化,将一些可去掉的属性操作都去掉了):
char*
devicename="/dev/video0";
char* buffer;
v4ldevice device;
int width =
640;
int height = 480;
int frame =
0;
v4lopen("/dev/video0",&device);//打开设备
v4lgrabinit(&device,width,height);//初始化设备,定义获取的影像的大小
v4lmmap(&device);//内存映射
v4lgrabstart(&device,frame);//开始获取影像
while(1){
v4lsync(&device,frame);//等待传完一帧
frame
= (frame+1)%2;//下一帧的frame
v4lcapture(&device,frame);//获取下一帧
buffer =
(char*)v4lgetaddress(&device);//得到这一帧的地址
//buffer给出了图像的首地址,你可以选择将图像显示或保存......
//图像的大小为
width*height*3
..........................
}
转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦

Ⅱ 请教各位大虾,linux怎样查看系统是支持v4l2还是v4l啊

查看系统/usr/include 下面的头文件,,<linux/videodev2.h>就说明支持v4l2
<linux/videodev.h> 支持v4l

一般情况下,只有其中的一个头文件

不过很多系统已经不支持v4l 了,,ubuntu就是的,,,

Ⅲ V4L的简介

II.Linux系统中的文件操作
有关Linux系统中的文件操作不属于本文的内容。但是还是要了解相关系统调用的作用和使用方法。其中包括open(),read(),close(),ioctl(),mmap()。详细的使用不作说明。在Linux系统中各种设备(当然包括视频设备)也都是用文件的形式来使用的。他们存在与dev目录下,所以本质上说,在Linux中各种外设的使用(如果它们已经正确的被驱动),与文件操作本质上是没有什么区别的。
现在出现Video4Linux2 (Video for Linux Two),简称V4L2。很显然,他是V4L的改进版,修复了第一代的部分设计bug。从2.5.x开始,V4L2就被集成到内核里面去了。尽管如此,还是有一部分设备的驱动不支持新版本的V4L2,所以,有时候我们会看到V4L跟V4L2同时出现在代码里面。
可参考网络词条:Video4Linux,或者扩展阅读部分。

Ⅳ 求armv4l-unknown-linux-gcc编译器 我在编译gsoap时ubuntu里找不到了

具体讲一下是怎么回事. 为什么用armv4l-unknown-linux-gcc

Ⅳ make: armv4l-unknown-linux-gcc:命令未找到

在 bashrc 加上 export PATH="$PATH:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/bin" 路径自己改

Ⅵ 在linux下写v4l,编译的时候出现error: expected ‘;’, ‘,’ or ‘)’ before numeric constant

语法错误,最好找的错误了

Ⅶ video4linux(v4l)使用摄像头图像采集的实验 在fedora下ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf)) 执行失败

1.video4linux基础相关
1.1 v4l的介绍与一些基础知识的介绍
I.首先说明一下video4linux(v4l)。
它是一些视频系统,视频软件,音频软件的基础,经常使用在需要采集图像的场合,如视频监控,webcam,可视电话,经常应用在embedded linux中是linux嵌入式开发中经常使用的系统接口。它是linux内核提供给用户空间的编程接口,各种的视频和音频设备开发相应的驱动程序后,就可以通过v4l提供的系统API来控制视频和音频设备,也就是说v4l分为两层,底层为音视频设备在内核中的驱动,上层为系统提供的API,而对于我们来说需要的就是使用这些系统的API。
II.Linux系统中的文件操作
有关Linux系统中的文件操作不属于本文的内容。但是还是要了解相关系统调用的作用和使用方法。其中包括open(),read(),close(),ioctl(),mmap()。详细的使用不作说明。在Linux系统中各种设备(当然包括视频设备)也都是用文件的形式来使用的。他们存在与dev目录下,所以本质上说,在Linux中各种外设的使用(如果它们已经正确的被驱动),与文件操作本质上是没有什么区别的。
1.2 建立一套简单的v4l函数库
这一节将一边介绍v4l的使用方法,一边建立一套简单的函数,应该说是一套很基本的函数,它完成很基本的够能但足够展示如何使用v4l。这些函数可以用来被其他程序使用,封装基本的v4l功能。本文只介绍一些和摄像头相关的编程方法,并且是最基础和最简单的,所以一些内容并没有介绍,一些与其他视频设备(如视频采集卡)和音频设备有关的内容也没有介绍,本人也不是很理解这方面的内容。
这里先给出接下来将要开发出来函数的一个总览。
相关结构体和函数的定义我们就放到一个名为v4l.h的文件中,相关函数的编写就放在一个名为v4l.c的文件中把。
对于这个函数库共有如下的定义(也就是大体v4l.h中的内容):
#ifndef _V4L_H_
#define _V4L_H_
#include <sys/types.h>
#include <linux/videodev.h> //使用v4l必须包含的头文件
这个头文件可以在/usr/include/linux下找到,里面包含了对v4l各种结构的定义,以及各种ioctl的使用方法,所以在下文中有关v4l的相关结构体并不做详细的介绍,可以参看此文件就会得到你想要的内容。
下面是定义的结构体,和相关函数,突然给出这么多的代码很唐突,不过随着一点点解释条理就会很清晰了。
struct _v4l_struct
{
int fd;//保存打开视频文件的设备描述符
struct video_capability capability;//该结构及下面的结构为v4l所定义可在上述头文件中找到
struct video_picture picture;
struct video_mmap mmap;
struct video_mbuf mbuf;
unsigned char *map;//用于指向图像数据的指针
int frame_current;
int frame_using[VIDEO_MAXFRAME];//这两个变量用于双缓冲在后面介绍。
};
typedef struct _v4l_struct v4l_device;
//上面的定义的结构体,有的文中章有定义channel的变量,但对于摄像头来说设置这个变量意义不大通常只有一个channel,本文不是为了写出一个大而全且成熟的函数库,只是为了介绍如何使用v4l,再加上本人水平也有限,能够给读者一个路线我就很知足了,所以并没有设置这个变量同时与channel相关的函数也没有给出。

extern int v4l_open(char *, v4l_device *);
extern int v4l_close(v4l_device *);
extern int v4l_get_capability(v4l_device *);
extern int v4l_get_picture(v4l_device *);
extern int v4l_get_mbuf(v4l_device *);
extern int v4l_set_picture(v4l_device *, int, int, int, int, int,);
extern int v4l_grab_picture(v4l_device *, unsigned int);
extern int v4l_mmap_init(v4l_device *);
extern int v4l_grab_init(v4l_device *, int, int);
extern int v4l_grab_frame(v4l_device *, int);
extern int v4l_grab_sync(v4l_device *);
上述函数会在下文中逐渐完成,功能也会逐渐介绍,虽然现在看起来没什么感觉只能从函数名上依稀体会它的功能,或许看起来很烦,不过看完下文就会好了。
前面已经说过使用v4l视频编程的流程和对文件操作并没有什么本质的不同,大概的流程如下:
1.打开视频设备(通常是/dev/video0)
2.获得设备信息。
3.根据需要更改设备的相关设置。
4.获得采集到的图像数据(在这里v4l提供了两种方式,直接通过打开的设备读取数据,使用mmap内存映射的方式获取数据)。
5.对采集到的数据进行操作(如显示到屏幕,图像处理,存储成图片文件)。
6.关闭视频设备。
知道了流程之后,我们就需要根据流程完成相应的函数。

那么我们首先完成第1步打开视频设备,需要完成int v4l_open(char *, v4l_device *);
具体的函数如下
#define DEFAULT_DEVICE “/dev/video0”
int v4l_open(char *dev , v4l_device *vd)
{
if(!dev)dev= DEFAULT_DEVICE;
if((vd-fd=open(dev,O_RDWR))<0){perror(“v4l_open:”);return -1;}
if(v4l_get_capability(vd))return -1;
if(v4l_get_picture(vd))return -1;//这两个函数就是即将要完成的获取设备信息的函数
return 0
}
同样对于第6步也十分简单,就是int v4l_close(v4l_device *);的作用。
函数如下:
int v4l_close(v4l_device *vd)
{close(vd->fd);return 0;}
现在我们完成第2步中获得设备信息的任务,下面先给出函数在对函数作出相应的说明。
int v4l_get_capability(v4l_device *vd)
{
if (ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)) < 0) {
perror("v4l_get_capability:");
return -1;
}
return 0;
}
int v4l_get_picture(v4l_device *vd)
{
if (ioctl(vd->fd, VIDIOCGPICT, &(vd->picture)) < 0) {
perror("v4l_get_picture:");
return -1;
}
return 0;
}
对于以上两个函数我们不熟悉的地方可有vd->capability和vd->picture两个结构体,和这两个函数中最主要的语句ioctl。对于ioctl的行为它是由驱动程序提供和定义的,在这里当然是由v4l所定义的,其中宏VIDIOCGCAP和VIDIOCGPICT的分别表示获得视频设备的capability和picture。对于其他的宏功能定义可以在你的Linux系统中的/usr/include/linux/videodev.h中找到,这个头文件也包含了capability和picture的定义。例如:
struct video_capability
{
char name[32];
int type;
int channels;
int audios;
int maxwidth;
int maxheight;
int minwidth;
int minheight;
};capability结构它包括了视频设备的名称,频道数,音频设备数,支持的最大最小宽度和高度等信息。
struct video_picture
{
__u16 brightness;
__u16 hue;
__u16 colour;
__u16 contrast;
__u16 whiteness;
__u16 depth;
__u16 palette;
}picture结构包括了亮度,对比度,色深,调色板等等信息。头文件里还列出了palette相关的值,这里并没有给出。
了解了以上也就了解了这两个简单函数的作用,现在我们已经获取到了相关视频设备的capabilty和picture属性。
这里直接给出另外一个函数
int v4l_get_mbuf(v4l_device *vd)
{
if (ioctl(vd->fd, VIDIOCGMBUF ,&(vd->mbuf)) < 0) {
perror("v4l_get_mbuf:");
return -1;
}
return 0;
}
int v4l_get_mbuf(v4l_device *vd)
{
if (ioctl(vd->fd, VIDIOCGMBUF ,&(vd->mbuf)) < 0) {
perror("v4l_get_mbuf:");
return -1;
}
return 0;
}
对于结构体video_mbuf在v4l中的定义如下,video_mbuf结构体是为了服务使用mmap内存映射来获取图像的方法而设置的结构体,通过这个结构体可以获得摄像头设备存储图像的内存大小。具体的定义如下,各变量的使用也会在下文详细说明。
struct video_mbuf
{
int size; 可映射的摄像头内存大小
int frames; 摄像头可同时存储的帧数
int offsets[VIDEO_MAX_FRAME];每一帧图像的偏移量
};
下面完成第3步按照需要更改设备的相应设置,事实上可以更改的设置很多,本文以更改picture属性为例说明更改属性的一般方法。
那么我们就完成extern int v4l_set_picture(v4l_device *, int, int, int, int, int,);这个函数吧
int v4l_set_picture(v4l_device *vd,int br,int hue,int col,int cont,int white)
{
if(br) vd->picture.brightnesss=br;
if(hue) vd->picture.hue=hue;
if(col) vd->picture.color=col;
if(cont) vd->picture.contrast=cont;
if(white) vd->picture.whiteness=white;
if(ioctl(vd->fd,VIDIOCSPICT,&(vd->picture))<0)
{perror("v4l_set_picture: ");return -1;}
return 0;
}
int v4l_get_mbuf(v4l_device *vd)
{
if (ioctl(vd->fd, VIDIOCGMBUF ,&(vd->mbuf)) < 0) {
perror("v4l_get_mbuf:");
return -1;
}
return 0;
}
对于结构体video_mbuf在v4l中的定义如下,video_mbuf结构体是为了服务使用mmap内存映射来获取图像的方法而设置的结构体,通过这个结构体可以获得摄像头设备存储图像的内存大小。具体的定义如下,各变量的使用也会在下文详细说明。
struct video_mbuf
{
int size; 可映射的摄像头内存大小
int frames; 摄像头可同时存储的帧数
int offsets[VIDEO_MAX_FRAME];每一帧图像的偏移量
};
下面完成第3步按照需要更改设备的相应设置,事实上可以更改的设置很多,本文以更改picture属性为例说明更改属性的一般方法。
那么我们就完成extern int v4l_set_picture(v4l_device *, int, int, int, int, int,);这个函数吧
int v4l_set_picture(v4l_device *vd,int br,int hue,int col,int cont,int white)
{
if(br) vd->picture.brightnesss=br;
if(hue) vd->picture.hue=hue;
if(col) vd->picture.color=col;
if(cont) vd->picture.contrast=cont;
if(white) vd->picture.whiteness=white;
if(ioctl(vd->fd,VIDIOCSPICT,&(vd->picture))<0)
{perror("v4l_set_picture: ");return -1;}
return 0;
}
上述函数就是更改picture相关属性的例子,其核心还是v4l给我们提供的ioctl的相关调用,通过这个函数可以修改如亮度,对比度等相关的值。

Ⅷ Linux下OpenCV 、V4L、MJPG-streamer的区别及应用相关问题,有点糊涂!

V4L是内核中的视频驱动框架,比如驱动电视机。
这个框架又包括用户需要的一系列API,好吧,这个API很复杂,你可以去V4L的官网看看。
MJPG-streamer,MJPG是一种视频编码格式,用于存储视频,网络传输视频的一种格式,所以本地显示视频前需要解码。V4L框架已经包含了硬件解码模块,所以你可以用V4L的API播放视频。

OpenCV 那就更高层了,你用opencv播放视频只需要几个函数就可以了,因为内部帮你做好了一切,你只需要控制逻辑就行了,opencv主要是用于视频智能分析的,比如移动侦测,手势控制等等。

Ⅸ v4l-utils设置摄像头曝光参数

客户需要设置android usb摄像头曝光参数

Video4Linux(V4L)是Linux中关于视频设备的内核驱动,它为针对视频设备的应用程序编 程提供一系列接口函数,这些视频设备包括现今市场上流行的TV卡、视频捕捉卡和USB摄像头等。对于USB口摄像头,其驱动程序中需要提供基本的I/O操 作接口函数open、read、write、close的实现.

android下使用v4l-utils,需要v4l-utils源码交叉编译Android的v4l-utils软件, 命令使用方法同上.

Ⅹ 利用linux的V4L获取图像数据时,用READ和MMAP两种方式的一些不理解

使用read和write需要在用户进程的缓冲和内核的缓冲区之间进行一次数据的拷贝过程是非常的浪费CPU的。而使用mmap可以将内核的缓冲区直接的映射在用户的进程内存中,减少了一次无价值的数据复制过程。

阅读全文

与v4llinux相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:963
phpffmpeg转码 浏览:672
长沙好玩的解压项目 浏览:145
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:737
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:486
h3c光纤全工半全工设置命令 浏览:143
公司法pdf下载 浏览:382
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:350
风翼app为什么进不去了 浏览:779
im4java压缩图片 浏览:362
数据查询网站源码 浏览:151
伊克塞尔文档怎么进行加密 浏览:893
app转账是什么 浏览:163