摘 要: 使用Qt结合OpenCV设计了一款基于嵌入式的无线视频监控系统,该系统具备人脸检测和头像保存功能。系统采用C/S结构,在ARM开发板上搭建的Qt多线程Linux系统服务器用于采集和发送视频;用Qt结合OpenCV制作的客户端运行在PC上,提供监控功能。介绍了Qt的Linux系统环境设置与ARM移植、V4L2视频采集的过程以及如何用Qt多线程处理视频数据。测试结果表明,在WiFi环境下,系统可进行有效的实时监控。
关键词: 无线视频监控;Qt;OpenCV;人脸检测
0 引言
无线视频监控系统具有无需布线、安装简单、监控点灵活的优点。嵌入式监控设备占用空间小、价格低。Linux操作系统可裁剪,适合在嵌入式设备上使用[1]。本文在ARM-Linux系统上利用Qt和OpenCV技术,结合TCP/IP传输协议,开发了一款带有图像处理功能的低成本实时无线视频监控系统,具备人脸检测和头像保存功能。
1 系统结构
无线视频监控系统由ARM服务器、PC客户端和无线路由器3个部分组成,如图1所示。ARM服务器设置USB摄像头的采集参数,将采集到的画面进行格式转换后(YUV转换成JPEG),通过USB无线网卡将视频画面发送出去;无线路由器为ARM服务器与远程PC客户端提供无线网络;PC客户端接收并显示视频,完成人脸检测、头像保存等处理。
本系统的服务器硬件由友善之臂Smart210开发板、EP-N8508GS无线网卡和USB摄像头组成。其中,Smart210开发板采用了三星S5PV210作为主处理器;EP-N8508GS无线网卡支持IEEE802.11N网络标准,传输速率为150 Mb/s;USB摄像头支持V4L2协议,采集视频格式为YUV。软件部分主要包括内核为3.0的Linux操作系统、Qt 4.7、OpenCV 2.4相关库、客户端和服务器软件。系统软件结构如图2所示。
2 服务器实现
2.1 Linux QT环境设置与ARM移植
本系统软件编程采用C/S模式,程序在PC Ubuntu环境下用Qt 4.7编写完成,分别用ARM、PC环境下的qmake编译器编译成可执行程序。如果统一采用PC环境下的qmake编译,服务器程序将无法在ARM上运行。这是由于ARM与PC的开发环境不同,可使用file指令来判断可执行程序的运行环境。Linux ARM版本的Qt环境配置流程如图3所示。
在完成Linux ARM版本的Qt环境配置后,还需要将生成的Qt库都加载到ARM开发板上才能在ARM上运行Qt程序,否则出现缺少依赖库的错误。
2.2 服务器软件设计
ARM服务器软件采用Qt编程,实现的功能有V4L2视频采集、视频格式转换、TCP视频传输。服务器的工作流程为:先启动监听状态,给出当前使用的IP地址和监听的随机可用端口号提示;当客户端连接上时发送视频数据。
2.2.1 V4L2(Video4Linux2)视频图像采集
V4L2是Linux下针对免驱动USB设备的编程框架,为视频采集设备的程序开发提供了统一的接口[2]。视频采集部分基于V4L2,将其定义为一个单独的videoDevice类,实现视频设备的初始化、打开、配置、设置内存映射、开始采集、读取缓冲区、视频格式转换、更新缓冲区、结束采集、取消内存映射、关闭、格式转换等功能。该类还定义了专门的槽函数,为后续的设备视频采集线程提供RGB24视频帧。
2.2.2 多线程处理视频数据
采用多线程可以提高程序的响应速度,在Qt应用程序中使用多线程只需子类化Qthread并且重新实现它的run()函数即可[3]。程序采用双线程,一个用于单帧图像的周期性采集并发送完成信号,另一个利用私有槽函数完成单帧图像的发送,两个线程在tcpServer类中进行连接,从而实现视频的连续采集与传输。在采集视频线程run()函数中,每隔一定时间获取视频帧并发送数据产生信号。视频发送线程采用基于块的传输协议把视频数据作为二进制块进行传输,每个数据块包含一个大小字段及单帧视频数据。在该线程中,将采集并经转化后得到的RGB24格式视频图像以JPG格式存入缓冲区发送;发送完成后,需要调用seek(0)函数以重新移到存储空间的开始处,避免出错。
2.2.3 基于TCP的视频传输
TCP是面向连接的通信协议,提供可靠的数据流服务,从而确保视频的有效传输。Qt提供的QTcpServer和QTcpSocket类,分别用于实现服务器和客户端[4]。
服务器视频传输程序主要由tcpServer和tcpClientSocket类完成。tcpServer重新实现了incomingConnection()函数。当客户端试图连接到服务器监听的端口时,调用该函数来创建视频采集和发送线程,并通过信号与槽将两个线程连接起来,从而实现视频帧的采集与发送。tcpClientSocket类利用connect()函数将readRead()和disconnected()信号分别与readClient()和slotDisconnected()槽连接起来,从而接收来自客户端的数据,以及当套接字连接关闭时,删除对象。
3 客户端实现
客户端软件设计采用Qt与OpenCV联合编程,Qt用于界面设计、视频接收与显示,OpenCV专注于对视频图像进行处理。客户端实现的功能有:(1)登录功能;(2)连接服务器并接收视频;(3)彩色与灰度视频切换显示;(4)拍照保存、人脸检测、头像保存功能。为了使用OpenCV,需要在Qt工程文件中添加OpenCV的库文件和路径。由于使用了网络传输协议,需要在Qt工程文件中添加QT+=network代码。
3.1 视频接收与彩色/灰度显示
客户端启动后,填入设备名、IP地址、服务器监听的端口号来连接服务器。程序使用槽函数将客户端连接到服务器,该槽函数在QTcpSocket对象上异步调用connectToHost()建立连接。当连接建立起来并运行时,QTcpSocket对象发送connected()信号,此时会执行sendData()槽函数将数据发给服务器;如果连接失败,QTcpSocket对象会发送错误信号。只要QTcpsocket对象从服务器上接收到视频数据,就发送readReady信号,此时程序调用dataReceived()槽函数。dataReceived()槽函数实现了3个功能:接收视频帧、统计每帧的数据量与总的帧数以及用判断语句来选择显示彩色/灰度视频。
3.2 人脸检测与头像保存
人脸检测使用OpenCV提供的检测图像中的目标函数cvHaarDetectObjects()和"haarcascade_frontalface_alt.xml"人脸检测分类器对视频流中的某幅图像进行搜索,从而确定图像中是否含有人脸并计数人脸数量。本功能启用后,会加载Haar检测分类器并分配资源,在图像格式转换后进行人脸检测与头像保存。
图4、5分别显示了人脸检测与头像保存的流程。通过目标函数调用人脸检测分类器在视频图像中找到包含人脸的矩形区域,用不同的颜色标识后返回矩形框序列[5]。头像保存是在人脸检测的基础上用cvSetImageROI()标识出头像区域,之后截取保存。
4 系统测试
在PC上编译服务器与客户端程序,通过串口将服务器可执行程序下载到ARM开发板上。在串口调试助手SecureCRT上输入扫描和连接WiFi的指令,并进行ping测试。确认WiFi环境可用后,在ARM上运行服务器程序,PC上运行客户端程序,测试结果如图6所示。
5 结论
本文介绍了一种基于Qt和OpenCV的嵌入式无线视频监控系统。经过测试,该系统达到了预期的效果,实现了无线实时监控,其人脸检测与头像保存功能增强了监控的能力,解决了常规监控系统只显示画面不能对画面进行处理的问题。此外,系统性能稳定,成本低廉,具有广泛的应用前景。
参考文献
[1] 马毅.基于Linux的远程视频监控嵌入式系统的设计与实现[D].上海:上海交通大学,2001.
[2] 周宝余,臧雪柏.基于QT的无线多路视频监控系统[J].吉林大学学报(工学版),2011,41(增刊):204-207.
[3] BLANCHETTE J, SUMMERFIELD M. C++ GUI programming with Qt4(Second Edition)[M]. NJ: Prentice Hall in association with Trolltech Press, 2008.
[4] 陈峰,郭爽,赵欣.基于Qt和嵌入式的视频监控系统[J].通信技术,2011,44(10):109-111.
[5] BRADSKI G, KAEHLER A. Learning OpenCV: computer vision with the OpenCV library(First Edition)[M]. CA:O′Reilly Media Inc, 2008.