基于V4L2的视频采集的具体实现过程

第一部分,设备初始化。
(1)首先:必须声明包含2个头文件:

#include<sys/types.h>
#include<linux/videodev.h>
(2)然后,进行设备初始化,打开视频设备,摄像头在系统中对应的设备文件为/dev/video0,通过系统调用函数open操作来完成。如下:

int fd=open("/dev/video”,O_RDW-R);
其中fd是设备打开后返回的文件描述符,系统调用函数可使用它对设备文件进行操作。

(3)接着通过调用ioctl VIDIOCGCAP操作读取struct video_capability中有关摄像头信息。如下:

struct video_capability grab_capability;
ioctl(fd,VIDIOCGCAP,&grab_capability);/获得struct video_capability中的摄像头的信息/
(4) 然后通过调用ioctl VIDIOCSFBUF设置内存缓冲区的相关信息,缓冲区的信息可以通过printf函数输出;

(5)通过调用Ioctl VIDIOCSWIN来完成对视频窗口的设置,如窗口宽度,高度等;

(6)接着通过调用loctl VIDIOCGPICT操作读取struct video_capability中有关图像信息。如下:

struct video_picture grab_picture;
ioctl(fd,VIDIOCGPICT,&grab_picture);/获取图像信息/
(7)在获取图像信息后,还可以根据需要改变这些信息,例如对比度、亮度、调色板等,具体做法是先给video_picture中的相应变量赋新值,再利用Ioctl VIDIOCSPICT函数进行设置。如下:

grab_picture.colour=65535;
if(ioctl(fd,VIDIOCSPICT,&grab_picture))<0)
{
perror("VIDIOCSPICT”);
return-1;
}
(8)接着初始化channel,必须先完成vd->capability中的信息调用,使用下列函数:

int v4l_get_channels(v4l_device *vd)
第二部分,使用mmap方式截取视频。
(1)首先调用ioctl(fd,VIDIOCGMBUF,&grab_vm)函数获取摄像头存储缓冲区的帧信息,之后初始化video_mbuf修改video_mmap中的设置,重新设置图像信息如帧的垂直及水平分辨率、彩色显示格式等。如下:

structvideo mmap grab_buf ; //以下为设置图像帧缓冲区信息
grab_buf.frame=0; //一次只采集一帧
grab_buf.height= 240; //图像高度
grab_buf.width=320; //图像宽度
grab_buf.format=VIDEO_PALETTE_RGB24; //图像的调色板格式,24位真彩色
unsigned char data=mmap(0,2403203,PROT_READ| PROT_WRITE,MAP_SHARD,fd,0); //内存映射 接着把摄像头对应的设备文件映射到内存区
ioctl(grab fd,VIDIOCMCAPTURE,&grab_buf); //采集图像
(2)然后调用ioctl(grab fd,VIDIOCSYNC,&frame)函数,该函数成功返回则表示采集完毕,采集到的图像数据放到以data为起始地址,长度为240
320*3的内存区域中,读取该内存中的数据便可得到图像数据。
(3)在此基础上同样可实现连续帧的采集,即一次采集连续多帧图像的数据。此时首先要设置grab_bur.frame为要采集的帧数。在循环语句中,也是使用ioctl VIOCMCAPTURE和ioctl VIDIOCSYNC操作完成每帧读取,但是要给采集到的每帧图像赋地址为data+grab_vm.offsets[frame],然后保存文件格式。其中grab_vm为video_mbuf结构体变量的一个声明,利用ioctl(fd,VIDIOCGMBUF,
&grab_vm)便可获得grab 的信息。

(4)若要继续采集可再加一个外循环,在外循环语句中只要给原来的内循环再赋伊grab_buf.frame=0即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值