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

linuxv4l

发布时间:2022-12-27 23:32:21

‘壹’ 如何利用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
..........................
}
转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦

‘贰’ 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可以将内核的缓冲区直接的映射在用户的进程内存中,减少了一次无价值的数据复制过程。

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

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

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

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

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

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

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

‘陆’ V4L的定义

video4linux(v4l)是一些视频系统,视频软件,音频软件的基础,经常使用在需要采集图像的场合,如视频监控,webcam,可视电话,经常应用在embedded linux中是linux嵌入式开发中经常使用的系统接口。它是linux内核提供给用户空间的编程接口,各种的视频和音频设备开发相应的驱动程序后,就可以通过v4l提供的系统API来控制视频和音频设备,也就是说v4l分为两层,底层为音视频设备在内核中的驱动,上层为系统提供的API,而对于我们来说需要的就是使用这些系统的API。

‘柒’ 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,或者扩展阅读部分。

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

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

‘玖’ 5、从SAP通过变形推理可否推出OS

第一、操作系统层(OS)

第二、各种库(Libraries)和Android 运行环境(RunTime)

第三、应用程序框架(Application Framework)

第四、应用程序(Application)

以下分别介绍Andoid各个层次的软件的重点及其相关技术:

1.操作系统层(OS)

Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。

如果你学过计算机网络知道OSI/RM,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。也就是说 各层各司其职,各层提供固定的SAP(Service Access Point),专业点可以说是 高内聚、低耦合。

如果你只是做应用开发,就不需要深入了解Linux Kernel层。

显示驱动(Display Driver):常用基于Linux的帧缓冲(Frame Buffer)驱动。

Flash内存驱动(Flash Memory Driver)

照相机驱动(Camera Driver):常用基于Linux的v4l(Video for )驱动。

音频驱动(Audio Driver):常用基于ALSA(Advanced Linux Sound Architecture,高级Linux声音体系)驱动。

WiFi驱动(Camera Driver):基于IEEE 802.11标准的驱动程序

键盘驱动(KeyBoard Driver)

蓝牙驱动(Bluetooth Driver)

Binder IPC驱动: Andoid一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能。

Power Management(能源管理)

2. 各种库(Libraries)和Android 运行环境(RunTime)

本层次对应一般嵌入式系统,相当于中间件层次。Android的本层次分成两个部分一个是各种库,另一个是Android 运行环境。本层的内容

大多是使用C++实现的。

在其中,各种库包括:

▅ C库:C语言的标准库,这也是系统中一个最为底层的库,C库是通过Linux的系统调用来实现。

▅ 多媒体框架(MediaFrameword):这部分内容是Android多媒体的核心部分,基于PacketVideo(即PV)的OpenCORE,从功能上本库一共分为两大部分,一个部分是音频、视频的回放(PlayBack),另一部分是则是音视频的纪录(Recorder)。

▅ SGL:2D图像引擎。

▅ SSL:即Secure Socket Layer位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。

▅ OpenGL ES 1.0 :本部分提供了对3D的支持。

▅ 界面管理工具(Surface Management):本部分提供了对管理显示子系统等功能。

▅ SQLite:一个通用的嵌入式数据库

▅ WebKit:网络浏览器的核心

▅ FreeType:位图和矢量字体的功能。

Android 的各种库一般是以系统中间件的形式提供的,它们均有的一个显着特点就是与移动设备的平台的应用密切相关。

Android 运行环境主要指的虚拟机技术——Dalvik。Dalvik虚拟机和一般JAVA虚拟机(Java VM)不同,它执行的不是JAVA标准的字节码(bytecode )而是Dalvik可执行格式(.dex)中执行文件。在执行的过程中,每一个应用程序即一个进程(Linux的一个Process)。 二者最大的区别在于Java VM是以基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。

3.应用程序框架(Application Framework)

Android的应用程序框架为应用程序层的开发者提供APIs,它实际上是一个应用程序的框架。由于上层的应用程序是以JAVA构建的,因此本层次提供的首先包含了UI程序中所需要的各种控件:

例如: Views (视图组件)包括 lists(列表), grids(栅格), text boxes(文本框), buttons(按钮)等。甚至一个嵌入式的Web浏览器。

阅读全文

与linuxv4l相关的资料

热点内容
单片机的原理概述 浏览:506
火控pdf 浏览:267
如何复制云服务器centos环境 浏览:984
债权pdf 浏览:299
红色番字的app怎么下载 浏览:876
云服务器流程教课 浏览:702
中国农业银行app怎么没有网 浏览:997
几率表算法 浏览:902
程序员理工科 浏览:708
企业邮箱登录收件服务器地址 浏览:558
计算机思维与算法设计的重要性 浏览:664
linux刷新磁盘命令 浏览:76
我的世界如何查看服务器种子pc 浏览:284
linuxlamp编译安装 浏览:609
枚举算法ppt 浏览:184
cmd查看进程命令 浏览:956
手机内怎么删除APP 浏览:834
鱼群和鸟群算法区别 浏览:93
pdf尺寸设置 浏览:211
android访问本地服务器 浏览:512