节约存储空间的远程视频监控系统
2018-09-27刘伟,黄鲁,徐俊
刘 伟, 黄 鲁, 徐 俊
(1.中国科学技术大学 电子科学与技术系,安徽 合肥 230026;2.中国科学技术大学 信息科学实验中心,安徽 合肥 230026)
0 引 言
高性能IP网络的广泛部署推动了网络视频监控的快速发展。嵌入式设备价格低廉、便携性好。基于IP网络的嵌入式无线监控设备也在人们的生活中逐渐广泛应用[1]。传统视频监控为全天候实时录制,保存了大量的无用信息,占用存储空间。本文在嵌入式开发平台上,使用混合高斯模型提取前景目标,并结合帧间差分检测结果实时判断监测区域动态变化,仅对动态变化添加时间戳实时录制,节约存储空间,提高视频录制的有效内容[2]。
1 系统总体架构
如图1所示,系统采用主从(client/server)模式,由无线网络传输,ARM服务器,客户端3部分组成,其中服务端和客户端均基于Qt框架编程实现。
图1 系统总体框架
通过无线路由器连接客户端和服务端,传递视频图像数据和控制指令。服务器采用S5PV210微处理器的Smart 210
开发板[3],使用Linux下的V4L2(video for Linux2)接口USB摄像头,输出MJPEG格式图像;两路脉宽调制 (pulse width modulation,PWM)对左右和上下转动的舵机云台控制,实现多角度的视频监控。客户端结合OpenCV对监控区域移动检测,实时录像及图像保存;同时发送指令对服务端云台进行控制[4]。
2 ARM端服务器实现
2.1 Qt软件配置
为了保证Qt框架下编译的服务器程序能在ARM开发板上能运行,必须重新构建适用ARM板的 Qt编译套件[5]。开发环境是在虚拟机上Ubuntu16.04,并安装Qt 5.8。使用Cmake 3.8编译Jrtplib库文件分别生成适合于Windows和ARM板的库文件。
2.2 视频采集与发送
调用QTcpServer类监听客户端的连接申请,初始化图像采集线程,使用Qt下的信号与槽机制,采集线程的信号绑定主线程的发送槽函数,传递采集的图像数据到主线程发送函数。如图2所示。
图2 采集发送流程
2.2.1 MJPEG格式图像采集分析及实现
为减小视频数据的无线传输带宽需求并保障实时性,采用MJPEG格式压缩。查看Linux内核源码可知,对于MJPEG格式内核分配存储大小为Width·Height·2Byte, 而经过压缩的图像数据小于该值,因此存储空间中有不需要传输的无效数据。系统根据MJPEG格式特征提取完整1帧数据传入主线程发送。
重新实现Qt中QThead类的多线程run()函数,在run()函数内使用V4L2接口通过多线程方式采集图像数据,提高效率[6]。
2.2.2 基于RTP协议的主线程视频发送
图像视频采用基于UDP的RTP协议进行传输,使用Jrtplib库实现,只需实例化RTPSession类、RTPUDPv4TransmissionParams类、RTPSessionParams类,分别用于设置创建会话、传输参数、会话参数;由于Jrtplib库默认的传输包大小为1 400B,所以,需要调用RTPSession︰︰SetMaximumPacketSize()设置传输包最大限制,对于640像素×480像素格式的摄像头可设置为65 536。Qt图像采集线程发送信号触发主线程执行RTPSession︰︰SendPacket()函数完成图像数据网络发送。此外由于Jrtplib相对于Qt是第三方库文件,所以需要在.pro文件下添加INCLUDEPATH及LIBS路径。
2.2.3 云台控制
S5PV210微处理器输出2路PWM信号。使用Linux下的Misc(杂散类)驱动模型配置寄存器值参数。 PWM模块时钟源为pclk=66.7 MHz,云台舵机最小占空比步进为10 μs,fpwm=50 Hz,则PWM模块的定时器频率为fTimer=100 kHz。根据公式参数配置如下[7]
(1)
取prescaler_value=165,divider_value=4,得到定时器计数值tcnt=2 009,输出的PWM周期为20.09 ms。
为使ARM服务端启动时自动加载PWM驱动模块,在文件系统/etc/init.d/rcS中添加如下两条命令:
insmod pwm0.ko;insmod pwm1.ko
采用两个型号为SG90的180°转角舵机实现上下和左右自由旋转,使用两路周期为50 Hz的PWM信号调节输出占空比控制舵机转动,如图3 舵机模型及实物,高脉宽时间Td对应的转动角度。
图3 舵机模型及实物
3 Windows上监控客户端实现
使用Qt编写客户端界面如图4所示,客户端包括视频实时显示、图像保存、实时录像控制、云台控制部分。为能够使用 OpenCV库需要在.pro工程文件中添加INCLUDEPATH及LIBS路径。
图4 Windows客户端显示
3.1 接收RTP数据及云台控制
重新实现Qt下的QThread︰︰run()多线程函数[9],数据接收只需用到Jrtplib库中的RTPSession类即可,循环调用RTPSession︰︰poll()接收数据,通过GotoFirstSourceWithData()及GotoNextSourceWithData()判断有效数据源,最后通过类中的GetNextPacket()抽取有效的图像数据包;使用QByteArray︰︰fromRawData()构建QByteArray类型数据,以Qt︰︰DirectConnection方式连接主线程中的显示槽函数,在显示函数中构建QImage类型数据,使用setPixmap()将图形放入预设大小为640像素×480像素的QLable中显示。
使用TCP协议传输云台控制命令,分别在4个PushButton的clicked()槽函数中实现对摄像头云台上下左右控制命令发送,命令数据包格式为“舵机ID+占空比”,接收端通过对数据包解析,执行对应的响应函数。
3.2 动态检测及加时间戳录像
为了实现对监控区域动态侦测并录制,使用帧间差分法检测出变化量,计算量小,实时性好;通过差分运算基本上可以消除相邻帧的高相似度背景,而相邻帧在运动目标变化的区域有较大的差别;由于运动目标距离摄像头位置远近及目标大小影响帧间差分检测的结果,因此同时使用帧间差分检测结果与前景目标大小的比值作为动态检测的判别依据。结合OpenCV,使用混合高斯模型实时检测,得到背景B(x,y)图像。设Cn(x,y)为当前帧灰度图像,进行差分运算An(x,y)=Cn(x,y)-Cn-1(x,y),In(x,y)=Cn(x,y)-B(x,y),得到帧间差分结果An(x,y)及前景目标In(x,y)。
对差分结果进行开运算,消除光线强弱变化引入的噪点,平滑较大变化的二值图区域同时又不明显改变其面积;采用8邻域的连通域标记法,统计所有的连通域得到帧间差分面积Dn和前景面积Sn,T1,T3为变化的面积阈值,T2为比值系数,具体方法为:
1)当Dn>T1,变化足够明显,直接对当前帧加时间戳并录制;
2)当Dn较小时,同时前景面积Sn>T3,判断(Dn·100/Sn>T2,对当前帧加时间戳录制。
T1=100,T2=1,T3=500得到较好的实验效果。
检测并录制流程如图5,实验中检测效果如图6。
结合OpenCV对截图保存和录制的视频加时间戳格式为“年/月/日 时/分/秒”,主要采用Qt中QDateTime类,及CV︰︰putText()实现添加时间戳,并使用CV︰︰VideoWriter类完成视频录制。流程如图7所示。其中时间量转换为字符串代码如下:
QDateTime time=QDateTime︰︰currentDateTime();/*获取系统时间*/
QString str=time.toString(“yyyy/MM/dd hh︰mm︰ss”);/*字符转换*/
string text=str.toStdString();/*转为满足putText()的字符类型*/
图5 检测并录制流程
图6 实验中检测效果
图7 添加时间戳方法
4 系统测试
ARM开发板上电启动后,串口打印出如下信息表明舵机云台PWM驱动模块加载成功:[29.003502]pwm0 pwm initialized ok 29.033495]pwm1 pwm initialized ok。
ARM服务端通过USB-WiFi连上路由器,保证PC客户端和服务端在同一网段或使用路由器IP转发功能,进行ping测试;ARM开发板服务端执行:./camera-wifi-qws 指令启动服务端程序进入监听状态,Qt Creator中运行客户端,与服务器完成TCP连接;服务端为主频1 GHz-Linux3.0.8内核的Smart210开发板,以分辨率为 640像素×480像素,平均20帧/s视频采集并传输至主频为3.3 GHz,内存为8 GB的Windows客户端显示。截图保存及视频录制结果如图8所示。
图8 测试结果保存
使用
5 结束语
实现了一种节约存储空间的嵌入式视频实时监控系统,提高了常规视频监控存储的有效内容,节约了存储空间;可远程实时操控摄像头云台进行多角度监控,增强了监控能力;测试结果表过该系统运行稳定,具有较好的可靠性和实时性。