基于Qt的视频监控设计综述
- 格式:doc
- 大小:1.70 MB
- 文档页数:9
嵌入式系统 081200B301a 基于Qt的视频监控设计 一、应用需求分析 近年来,智能安防工作越来越受到重视,而视频监控作为安防的一种重要手段,其实现技术也迅速发展起来,简单高效的视频监控系统的需求进一步扩大。本系统设计实现一个基于mini2440的视频监控系统,包括摄像头视频采集、视频编码储存、基于Qt友好的操作界面等。其工作流程如图1.1所示:
图1.1 视频监控系统工作图 本监控系统实现的功能有一下几个方面: [1] 摄像头视频的实时采集及显示、视频播放暂停与恢复 [2] 友好简单的操作界面 [3] 基于H264或MPEG的视频编码储存 基于现实安防的需要,本监控系统需要实现以下几个技术指标: [1] 实时视频的采集与显示,至少需要达到每秒15帧 [2] 快速的视频编码过程 [3] 快速的系统响应,友好的操作界面 [4] 很低的编码出错率,系统良好的鲁棒性
二、应用系统总体结构设计描述 2.1硬件平台介绍 1) 核心板Mini2440: Mini2440 是一款真正低价实用的ARM9 开发板,是目前国内性价比最高的一款学习板;它采用Samsung S3C2440 为微处理器,并采用专业稳定的CPU 内核电源芯片和复位芯片来保证系统运行时的稳定性。
图 2.1 mini2440实物图
USB摄像头视频采集
SDL显示
H264编码储存 处理SDL屏幕事件 2) 摄像头:采用罗技USB摄像头 2.2 软件开发环境 1) 跨平台Qt开源库: Qt是一个跨平台的C++图形用户界面应用程序框架,支持windows,Linux,MAC OS。利用Qt 的开发环境 Qt Creator可方便进行Linux下的UI应用程序开发。 2) FFmpeg: ffmpeg 是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,这里我们采用H264编码。 3) SDL:SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,适用于 游戏、游戏SDK、演示软件、模拟器、MPEG播放器和其他应用软件。SDL内置了调用OpenGL的函数。通过使用SDL_image、SDL_ttf、SDL_mixer、SDL_net等外部扩展库,可以轻松实现JPG、PNG、TIFF图像的加载使用,TrueType字体的使用,MP3文件的使用、网络相关的使用等。 2.3 监控系统的框架图
图 2.2 监控系统框架图 USB Webcam ARM
调用SDL 接口显示 X264开源库边编码
C++ 标准库储存编码数据
响应SDL
事件
V4L2接口采集 三、系统实现 3.1 V4L2接口采集摄像头数据 V4L2 较V4L有较大的改动,并已成为2.6 的标准接口,函盖video/dvb/FM... ,多数驱动都在向V4l2 迁移。V4L2 采用流水线的方式,操作更简单直观,基本遵循打开视频设备、设置格式、处理数据、关闭设备,更多的具体操作通过ioctl 函数来实现。本次设计采用V4L2接口获取摄像头数据,获取的分辨力为320*240。其主要实现步骤如下: (1)打开文件:调用Open()函数打开设备文件,同时设置相应的设备属性,并返回设备文件的句柄。 (2)获取设备属性:调用ioctl()函数获取摄像头设备文件的相关参数,包括摄像头的名称、分辨力等相关属性 (3)设置格式及分辨力:调用ioctl()函数设置视频格式(常见的有RGB、YUV422及MJPEG等)及摄像头的拍摄分辨力(包括宽、高等) (4)申请缓存:设置申请缓存的类型及申请缓存的个数等 (5)缓存出对列:对申请成功的缓存进行队列操作,获取缓存的长度信息及并使用mmap()函数将内存地址映射到用户分配的地址空间中。 (6)缓存入队列:对每个申请的缓存进行入队操作,并使用ioctl()函数开始进行视频获取开始操作 (7)获取数据:循环等待摄像头数据,但摄像头数据可用时,进行出队列操作。此时其index所对应的mmap()映射的内存地址中就包含了摄像头数据,并调用SDL接口进行显示(SDL内容见2.3章节)。跳到7,继续获取摄像头数据。 (8)关闭摄像头: 调用close()函数关闭摄像头设备文件。 本次设计采用摄像头的采集分辨力为320*240,数据格式为YUV422格式,摄像头数据获取的流程图如3-1所示: 开始 使用Open()函数打开摄像头设备文件,返回摄像头设备句柄 ioctl(Camera_fd, VIDIOC_QUERYCAP, &cap)函数获取摄像头的
ioctl (Camera_fd, VIDIOC_S_FMT, &fmt)摄像拍摄画面的格式
ioctl (Camera_fd, VIDIOC_REQBUFS, &req)进行缓存申请
ioctl (Camera_fd, VIDIOC_QUERYBUF, &buf)进行缓存出队列操作,并将缓存
ioctl (Camera_fd, VIDIOC_QBUF, &buf)进行缓存入队操作,并ioctl (Camera_fd,
ioctl(Camera_fd, VIDIOC_DQBUF, &buf)进行缓存出队列,复制缓存的内存数据,调用SDL进行显示
最后一帧? 调用close()函数关闭摄像头
N Y
图3-1 V4L2采集摄像头视频流 3.2 SDL接口显示视频数据 SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,适用于 游 戏、游戏SDK、演示软件、模拟器、MPEG播放器和其他应用软件。SDL内置了调用OpenGL的函数。通过使用SDL_image、SDL_ttf、SDL_mixer、SDL_net等外部扩展库,可以轻松实现JPG、PNG、TIFF图像的加载使用,TrueType字体的使用,MP3文件的使用、网络相关的使用等。
在使用V4L2接口获取摄像头YUV422格式数据之后,在调用SDL将摄像头数据实时显示在屏幕上。SDL显示分为以下五步组成: 1) 初始化SDL链接库 2) 设置视频显示参数包括分辨率、像素深度及显示格式 3) 创建SDL显示窗口及与窗口连接的位图对象 4) 加锁位图对象,将Socket接受的摄像头数据复制到位图对象的内存空间,最后解锁位图对象
开始 SDL初始化:SDL_Init(SDL_INIT_VIDEO |
创建视频显示对象:screen = SDL_SetVideoMode(WI
创建位图对象:SDL_CreateYUVOverlay(WIDTH,
将要显示的摄像头数据复制到位图的内存空间,同时通知SDL进行刷新
最后一帧? SDL_Quit()
N Y
图3-2 SDL显示摄像头视频流程图 5) 通知SDL刷新窗口 3.3 H26视频编码 H.264或称AVC(Advanced Video Coding,高级视频编码),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式。H.264是一种面向块的基于运动补偿的编解码器标准。H.264因其是蓝光碟片的一种编解码标准而著名,所有蓝光碟片播放器都必须能解码H.264。它也被广泛用于网络流媒體数据如Vimeo、YouTube、以及iTunes Store,网络软件如Adobe Flash Player和Microsoft Silverlight,以及各种高清晰度電視陆地广播(ATSC,ISDB-T,DVB-T或DVB-T2),线缆(DVB-C)以及卫星(DVB-S和DVB-S2)。这里我们采用FFmpeg中的H264编码函数库对V4l2采集数据YUV422数据进行编码,其处理流程有以下几个方面,其处理流程图如3.3 所示 1) 图像数据预处理:从YUV422 打包格式转换为YUV420平面格式 2) 初始化FFmpeg的相关库函数,包括H264编码器 3) 设置编码参数,包括压缩质量、图像分辨率等参数 4) 开始编码,对编码结果数据流写入磁盘保存 5) 释放编码器H264
图3-3 H264编码流程图 开始
图像数据预处理: YUV422 to YUV420
初始化编码器、设置编码参数(压缩质量、图像方分辨率、数
H264图像压缩
Last frame? N Y 结束 四、 系统调试分析及展望 4.1 系统性能分析 在mini2440上连接罗技USB摄像头,运行编写的监控软件,即可看到摄像头拍到的画面,如下所示:
图 4-1 摄像头监控画面 我们对监控系统的实时性进行测试,共进行了一下三次测试,获得表4-1中数据 表4-1 系统实时性测试 Index 总帧数 时间(s) 平均每秒的帧数(p/s) 1 148 10 14.8 2 293 20 14.65 3 437 30 14.56 从上表数据可以看出监控系统采集帧数达到接近15帧每秒,基本满足监控系统的实时性要求!同时我们对摄像头缓存数据采用H264进行压缩,在不损失关键图像数据的情况下,统计发现其压缩比达到25倍,达到监控系统的要求! 4.2 系统展望 对本监控系统的实时性、编码效率及实用性进行测试,发现本系统存在以下不足: 1) 实时性还存在不足,在拍摄画面中存在运动场景时,存在短时间不流畅的现象 2) H264算法较为复杂,由于mini2440的处理能力有限,使系统压缩效率不高 3) Mini2440屏幕分辨率有限,无法显示高清监控画面 为此针对以上不足,在此提出以下改进意见: