嵌入式Linux视频采集系统设计与研究

嵌入式Linux视频采集系统设计与研究

作者:陈少祥李临生

来源:《电子世界》2013年第01期

【摘要】v4L2(Video For Linux Two)是Linux系统下进行图像、视频开发的应用编程接口。本文首先分析V4L2的图像采集驱动和流程,然后在Linux环境下设计并实现视频采集终端程序设计,并在天嵌S3C2440的ARM板开发平台上移植嵌入式视频采集终端。与此同时,还在ARM开发板上实现实时动态采集视频图像的播放。本文对视频采集的设计方法和监控系统的后端处理具有实用价值。

【关键词】V4L2;嵌入式;Linux

一、引言

嵌入式系统是将操作系统和功能软件集成于计算机硬件系统中,从而实现软件与硬件一体化的计算机系统。嵌入式系统的体积小、功能专一、裁剪性能好、功耗低、可靠性能高、集成度高。随着微电子技术和计算机软件技术的发展,嵌入式系统不但在军事和工业控制领域得到广泛应用,而且在通信、办公自动化和消费电子领域也获得普及[2]。每年在全球范围内的电子产品产量大概在20亿左右,其中80%以上应用于各类专用性很强的嵌入式系统中。

二、本文的设计研究方向和目的

人类传递信息主要依靠的是语音和图像。在人类接受信息过程中,通过视觉得到的信息占据一半以上,所以作为信息传递的重要媒体的图像信息占有十分重要的地位。本文正是针对人们对图像信息的需求以视频监控系统为研究背景,设计了基于Linux的嵌入式视频采集系统。本文通过ARM板作为硬件开发平台,熟悉基于嵌入式Linux操作系统的视频图像采集,掌握嵌入式系统开发的基本技术。本文研究的内容,适应当前嵌入式开发领域的发展,能丰富嵌入式技术的内容,具有一定的研究价值。

三、嵌入式Linux视频采集系统设计

在Liunx系统下,所有外设都被看成是一种特殊的文件,称为设备文件[3]。V4L2是Video For Linux Two的简称作为Linux系统下的一种通用视频架构,应用于许多嵌入式视频设备之中,V4L2为Linux的视频驱动提供了统一的接口,使应用程序可以使用统一的API函数操作不同的视频设备。

V4L2图像采集程序流程过程分为打开视频设备、设置图片格式、分配缓冲区、读取数据、关闭设备等步骤[4]。以下是本文通过使用V4L2应用编程接口提供的有关数据结构定义和函数,编写的视频图像采集程序。程序流程如图1所示。

(一)打开视频设备文件:i

打开视频设备后,open()函数获得文件描述int fd.。使用阻塞模式,只有数据准备充分时驱动才可以把缓存的数据返回给应用程序。本系统保持默认的阻塞模式。

(二)读取视频设备的属性:

在Linux程序设计中,ioctl调用提供了一个用于控制设备及其描述符行为和配置底层服务的接口,对设备的I/O通道进行管理,其语法为:ioctl(int fd,int request,void *argp)。其中fd为设备文件描述符,通过open()函数获得;request为系统调用命令类型,用于告诉系统要完成的任务(即向系统发出的命令);argp为用户数据指针,用于传递参数或接收数据。以下是几种常用的命令类型和对应的数据结构,这些类型都在videodev.h中进行了定义[1]:

VIDIOC_QUERYCAP,获取视频设备的属性,主要包括驱动名称,设备名称,设备在系统中的位置等。数据类型为struct v4l2_capablility。

VIDIOC_ENUM_FMT,显示视频设备所有支持的格式,主要参数包括:要查询的格式序号,帧类型,是否为压缩格式等。数据类型为struct v4l2_fmtdesc。

VIDIOC_G_FMT/VIDIOC_S_FMT,获取/设置数据格式,主要是图片的宽高、每像素所占bit和像素格式。数据类型为struct v4l2_format。

VIDIOC_REQBUFS,用于内存映射方式,该命令可以在驱动层申请多个缓冲区存放采集到的图片。需要注意的是需要使用mmap将其映射到用户空间才能访问。数据结构类型为

v4l2_requestbuffers。

VIDIOC_QUERYBUF,用于内存映射方式,该命令可以查询由VIDIOC_REQBUFS申请到的缓冲区的大小和偏移地址,这两个参量会作为参数传给mmap。数据结构类型为

structv4l2_buffer。

VIDIOC_QBUF,用于内存映射方式,该命令的作用是将VIDIOC_REQBUFS申请的缓冲区放入采集队列,只有这样驱动才会将采集到的数据写入缓冲区。数据结构为

structv4l2_buffer。

VIDIOC_DQBUF,用于内存映射方式,该命令的作用是将填充数据的一个缓冲区取出队列。需要注意的是,应用程序处理完数据后,需要使用VIDIOC_QBUF 重新将该缓冲区放入采集队列。

VIDIOC_STREAMON/VIDIOC_STREAMOFF,这两个命令用于启动/停止视频数据的采集或输出。数据结构为enum v4l2_buf_type。

相关文档
最新文档