基于USB摄像头的嵌入式视频监控系统.doc_第1页
基于USB摄像头的嵌入式视频监控系统.doc_第2页
基于USB摄像头的嵌入式视频监控系统.doc_第3页
基于USB摄像头的嵌入式视频监控系统.doc_第4页
基于USB摄像头的嵌入式视频监控系统.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要:在嵌入式环境下设计开发了一套基于USB摄像头的视频监控系统。系统通过V4L接口从USB摄像头采集图像,借助QT图形库实现视频播放;通过OSS接口实现音频数据的采集与播放;同时能将音视频信息录制成通用的AVI格式文件保存到U盘中。实验表明系统的设计方案和实现技术是可行的。 中国论文网 关键词:嵌入式系统;视频监控;USB摄像头;V4L接口 中图分类号:TP391文献标识码:A文章编号:1009-3044(2012)22-5459-04 Embedded Video Monitoring System Based on USB Camera LI Jian (Teaching and Research Section of Computer, The PLA Foreign Language University, Louyang 471003, China) Abstract: A video monitoring system was designed and developed based on USB camera in embedded environment. In the system, pictures are captured from USB camera through V4L API and displayed on LCD by QT; Sound data is captured and played through OSS API; in addition, video and sound data can be record on USB disk as AVI files. Experiment shows that the design and implement teleology of the system are feasible. Key words: embedded system; video monitoring; USB camera; Video for Linux API 传统的以PC机为处理核心的视频监控技术已经十分成熟,但随着后PC时代的到来,使用嵌入式系统现实视频监控将是未来的发展趋势。从某种意义上讲使用通用的PC机来完成专用功能是对资源的一种浪费。虽然嵌入式系统的资源相对有限,但其所有资源都能被充分利用,同样能够很好地实现某种专用功能。因此使用嵌入式系统取代PC机进行视频监控就意味着用更少的资源提供更好的功能。本文将介绍一个嵌入式视频监控系统的设计开发过程。 1系统总体设计 1.1系统总体架构 系统建立以S3C2410核心板为中心的硬件平台,内置CPU、RAM和Flash1,外接LCD显示器、USB摄像头等外围设备;移植嵌入式Linux操作系统到硬件平台并安装QT图形库和必要的驱动程序,为系统运行提供软件环境。系统的总体架构如图1所示,其中清晰地展示了数据的加工流程。 图1系统总体架构 系统所选用的USB摄像头基于ZC301芯片,该摄像头采用片内JPEG压缩技术;设备驱动后通过V4L(Video for Linux)接口对其操作,可以直接从摄像头读取JPEG格式的数据2。通过开发QT用户图形界面来完成JPEG图像的显示。音频接口选用UDA1341芯片,可外接话筒和扬声器;设备驱动后通过OSS(Open Sound System)编程接口对其进行操作,可以从UDA1341芯片读取或写入PCM编码数据3。文件录制模块把音视频信息录制为通用的AVI文件并存储在外接U盘中。 1.2系统总体流程 为了提高系统的运行效率,设计了两个线程来实现此模块的功能:一个为音视频采集线程,一个为播放/录制线程。采集线程启动后首先打开音视频设备,设置相关参数后不断采集音视频信息写入共享缓冲区;播放/录制线程在完成相关设备初始化后进入循环,根据需要从共享缓冲区读取音视频信息进行播放或录制。两个线程通过Linux提供的线程函数实现对音视频缓冲区的互斥访问,其协作流程如图2所示。 图2系统总体流程 2音视频采集 2.1视频采集 V4L是开源社区的领袖人物Alan Cox为Linux设计的一套规范,其目的是为Linux下的视频设备驱动的编写提供统一的接口20。V4L的主要接口函数包括:open()、read()、write()、close()和ioctl(),分别用于打开、读取、写入、关闭和控制视频设备。其中ioctl()接口能够实现对摄像头的多种控制,通过控制参数来区分,表1列出了一些常用的控制常量。 表1 ioctl()中使用的部分控制常量 ZC301芯片采用片内JPEG压缩技术,即利用V4L编程接口采集出的数据是就压缩后的JPEG文件,能够拍摄最大分辨率640480的照片(本系统采用320240的分辨率)。为了方便对视频设备的操作,程序中专门定义了一个名为V4LDevice的结构体,同时定义一个全局变量vd。结构体的定义如下: struct V4LDevice int fd;/视频设备描述符 struct video_capability capability; /获取设备的基本信息 struct video_picture picture; /设置图像属性 struct video_window window; /设置捕捉区域 unsigned char pic_bufferBUFFER_SIZE;/视频缓冲区 int pic_size;/当前图像实际大小 pthread_mutex_t lock; /视频缓冲区的互斥锁 vd; V4L编程的一般过程为:打开视频设备、读取当前参数、设置相关参数、读取或循环读取视频数据、对视频数据进行相关处理、关闭视频设备。按照对视频设备的操作顺序,首先打开视频设备并完成相关设置,下面给出主要代码: vd.fd = open (/dev/video0, O_RDWR); /以读写方式打开设备结点i octl (vd.fd, VIDIOCGCAP, &vd.capability); /读取设备的基本信息 vd.picture.depth = 8;/图片色彩深度 vd.picture.palette = 21;/图片样式,21表示JPEG vd.picture.colour = 32768;/取一个适中值 ioctl (vd.fd, VIDIOCSPICT, &vd.picture);/设置图片信息 vd.window.height = 240;/图像高度 vd.window.width = 320;/图像宽度 ioctl (vd.fd, VIDIOCSWIN, &vd.window);/设置图像大小 pthread_mutex_init (&vd.lock, NULL);/初始化互斥锁 vd.pic_size = 0;/当前图像实际大小 在上述代码中分别通过控制常量VIDIOCSPICT和VIDIOCSWIN完成图片样式和大小的设置。摄像头设置完成后线程就会不断循环采集图像到缓冲区,下面给出循环体中采集图像的相关代码: char bufferBUFFER_SIZE;/定义一个局部缓冲区 int size = read (vd.fd, buffer, BUFFER_SIZE);/读取JPEG数据f or(j=2; j = size; j+)/获取当前图像数据长度 if(*(buffer + j - 2) = 0xFF & *( buffer + j - 1) = 0xD9) break; if (pthread_mutex_trylock(&vd.lock) = 0)/对全局缓冲区加锁 vd.pic_size = j;/更新当前图像数据长度 memcpy (vd.pic_buffer, buffer, BUFFER_SIZE);/更新当前图像数据 pthread_mutex_unlock (&vd.lock);/对缓冲区解锁 摄像头每次采集的图像数据大小不尽相同,但根据JPEG的文件结束标志为“0xFFD9”可以获得图像数据的实际大小。采集完成后需要将视频数据互斥地写入全局缓冲区,这里用到多线程函数pthread_mutex_trylock()和pthread_mutex_unlock()完成对缓冲区的加锁和解锁。 2.2音频采集的实现 OSS(Open Sound System)是最早出现在Linux上的音频编程接口,它由一套完整的内核驱动程序模块组成,可以为绝大多数声卡提供统一的编程接口21。Mixer(混音器)和DSP(数据信号处理器)为OSS标准中的两个基本音频设备。Mixer设备的驱动接口相对简单,除了open()和release()外,主要使用ioctl()方法实现对输入/输出音量的控制。DSP设备所提供的驱动接口主要有open()、ioctl()、read()、write()、close()、release()。 与视频采集类似,程序中定义了名为DspDevice的结构体用于音频设备操作,同时定义全局变量dd。该结构体中除了包括设备的文件描述符、设备相关参数、音频缓冲区等信息外,还定义了一个变量flag_display用于标记当前音频数据是否被播放过。由于音频的一帧表示一个时段,如果出现播放重复则会严重影响声音的质量,而通过标记flag_display可以避免这种情况。兼顾声音质量和节省存储空间,我们在设备初始化时将量化位数设为8位,声道类型选择双声道,采样速率设为8000Hz。音频采集的方式与视频类似,下面列出循环体中音频采集的主要代码: char buffer2AUDIO_LENGTH;/定义一个局部缓冲区 read (dd.fd, buffer, AUDIO_LENGTH);/采集音频数据 if (pthread_mutex_trylock(&w-dd.lock) = 0)/加锁 memcpy (w-dd.sound_buffer, buffer, AUDIO_LENGTH); dd. flag_display=1;/播放标志(1表示未播放) pthread_mutex_unlock (&w-dd.lock); /解锁 3音视频播放 3.1视频播放的实现 Qt是一个跨平台的C+图形用户界面应用程序框架,起初由挪威TrollTech公司开发,后来由诺基亚公司收购。QT类似于Windows平台下的MFC或ATL等,可用于实现图形界面、网络通信、线程控制、文件操作等等4。 视频播放本质上就是要将图像显示在服务器端的LCD上,这需要借助QT的图形界面来完成。由于Qt的最新版本对硬件条件要求较高,本系统选用Qt的早期版本2.3进行图形界面的开发。摄像头采集是JPEG格式的图像,而本系统所选用的Qt版本并不直接支持JPEG格式图像,所以首先要安装JPEG库使QT支持JPEG格式5。具体绘制图像的功能是通过QT中的QPixel和QPainer类来完成,下面给出绘制图像的关键代码: QPainter painter (w);/定义一个QPainter对象 painter.setClipRect (w-rect ();/设置painter的绘制区域 QPixmap pixmap;/定义一个QPixmap对象 pthread_mutex_lock (&vd.lock);/对视频缓冲区加锁 struct packet_head *head = (struct packet_head *) w-vd.pic_buffer; int jpeg_size = head-data_size;/获取图像大小 unsigned char *jpeg_data = vd.pic_buffer+head-head_size;/获取数据指针 if(pixmap.loadFromData (jpeg_data, jpeg_size, JPEG, QPixmap:Auto) painter.drawPixmap(10, 55, pixmap);/绘制图像 pthread_mutex_unlock(&vd.lock);/对视频缓冲区解锁 3.2音频播放的实现 由于系统所选用的UDA1341音频芯片同时支持音频的采集与播放,本地音频播放同样采用此设备完成。与音频采集相对应,使用写(write)操作完成音频播放,而采集则是读(read)操作。下面给出本地音频播放的主要代码: pthread_mutex_lock (&w-dd.lock); if (dd.flag_display = 1)/如果当前音频数据是否播放过 write (w-dd.fd, w-dd.sound_buffer, AUDIO_LENGTH); dd.flag_display = 0;/将当前数据设为已播放 pthread_mutex_unlock (&w-dd.lock); 在上述代码中对flag_display的判断是为了避免对同一音频数据进行重复播放,播放完成当前数据后,应将其状态设为已播放。 4 AVI文件的录制 AVI(Audio Video Interleaved)是一种将音视频同步组合的文件格式,它符合RIFF(Resource Interchange File Format)规范6。一个AVI文件通常包含两个不同类型的媒体流:一个音频流和一个视频流,不过含有单一音频流或单一视频流的AVI文件也是合法的。由于AVI文件的内部结构比较复杂,这里不再详述7。 文件录制与视频播放在同一个线程内完成,当用户选择录制功能后,系统则在外接U盘中创建AVI文件,然后不断从音视频缓冲区读取数据写入文件;为了方便对录制文件的管理,系统规定了每个AVI文件的大小为100M,当文件超过100M时则新创建一个文件继续录制。 AVI文件由文件头、数据块和索引块三部分组成。文件头中除了包括编码类型、图像大小、声道类型、采样率等静态信息之外,还包含了的文件长度、播放时间、帧率等动态信息,这些信息必须在AVI文件录制完毕后才能全部获得,虽然它是文件的开始部分却应最后写入;数据块是AVI的主体部分,包含若干音频帧和视频帧,在录制过程中不断增加;索引块是可选的,保存了每一帧数据在文件中的位置以加速对文件的读取,本系统保留了这一域。 图3本地录制的实现框架 由于AVI文件录制的实现过程比较复杂,所涉及的代码较多,整个录制过程主要由以下四个功能函数来实现:new_AVI_file()函数完成创建AVI文件的创建

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论