基于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即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本课程详细、全面地介绍了 Qt 开发中的各个技术细节,并且额外赠送在嵌入式端编写Qt程序的技巧。整个课程涵盖知识点非常多,知识模块囊括 Qt-Core 组件、QWidgets、多媒体、网络、绘图、数据库,超过200个 C++ 类的分析和使用,学完之后将拥有 Qt 图形界面开发的非常坚实的功底。 每个知识点不仅仅会通过视频讲解清楚,并且会配以精心安排的实验和作业,用来保证学习过程中切实掌握核心技术和概念,通过实验来巩固,通过实验来检验,实验与作业的目的是发现问题,发现技术盲点,通过答疑和沟通夯实技术技能。注意:本套视频教程来源于线下的实体班级,因此视频中有少量场景对话和学生问答,对此比较介意的亲们谨慎购买。注意:本套视频教程包含大量课堂源码,包含对应每个知识点的精心编排的作业。由于CSDN官方规定在课程介绍中不能出现作者的联系方式,因此在这里无法直接给出QQ答疑号,视频中的源码、资料和作业文档链接统一在购买后从CSDN平台跟我沟通,我会及时回复跟进。注意:本套视频教程包含全套10套作业题,覆盖所有视频知识点,循序渐进,各个击破,作业总纲如下:下面是部分作业题目展示,每道题都有知识点说明,是检验学习效果的一大利器:(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)…… ……

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值