张洪涛, 葛 林, 杨名军, 裴 浩, 范羖豪
(1 湖北工业大学电气与电子工程学院, 湖北 武汉 430068; 2 北京工业大学软件学院, 北京 100081)
随着科学技术的发展,视频监控系统在社会中的应用越来越多,而且视频监控的技术越来越成熟,已经从模拟化走向了数字化.模拟视频监控只适合小范围监控,扩展能力不足,几乎被社会所淘汰;数字视频监控又分为PC端监控和基于嵌入式的监控,后者比前者体积小、功耗小、功能稳定,而且在一些公共场所应用广泛.
整个嵌入式监控系统由三星S3C2440[1]开发板,宿主机,USB摄像头,无线网卡和监控端PC机构成.软件部分先移植Linux操作系统到ARM9开发板,然后动态加载USB摄像头驱动和无线网卡驱动.通过摄像头采集到视频数据然后压缩编码,经无线网卡把数据发送到PC机监控端,PC机与英特网相连,接收传输过来的视频数据,解压后显示在QT编写的监控界面上.系统总体框图见图1.
图 1 系统整体框图
本系统是以三星公司的ARM920T内核的S3C2440A微处理器为主控芯片的开发平台,主要由流媒体服务单元、USB摄像头、无线网卡和监控端组成(图2).S3C2440A时钟采用400 MHz的工作主频,最高可达533 MHz.本系统扩展了128 MB SDRAM、64MB NorFlash及64MB NandFlash,外设有100 M以太网接口、RS-232串口和三个扩展接口、3个USB Host接口及下载引导程序的JTAG接口等.USB摄像头芯片为中星微ZC301P[2].无线网卡采用的是GPRS DTU[3].
图 2 系统硬件图
图像采集模块使用中星微ZC301P芯片的摄像头, ZC301P芯片最高支持VGA(Video Graphics Array)分辨率(640×480).在VGA模式下速率可达到15帧/s,在CIF(Common Intermediate Format)(352×288)和 SIF(Standard Image Format)(320×240)模式下速率可达到30帧/s.
传输模块采用的是与开发板串口相连的无线网卡GPRS DTU.GPRS DTU是一种基于GPRS网络的无线数据终端,具有较大的网络覆盖面,支持数据透明传输,支持断线自动重连功能.
首先移植Linux系统到开发板上.本系统用的是S3C2440A开发板,uboot,kernel,cramfs文件系统的代码都是开源的,配置宿主机的ftp、tftp、nfs服务,下载开发包用交叉编译器编译之后通过nfs下载到开发板上,完成移植.
使用命令lsmod查看加载的modules,将ZC301P的驱动和GPRS DTU的驱动放到相应的内核目录下,使用命令make menuconfig配置内核,再次编译,然后移植到开发板上.也可以通过模块加载的方式,直接编译驱动,得到.ko文件,下载到开发板上,然后使用命令make install或者modprobe gspca(驱动名)加载驱动模块,但是modprobe能使模块载入的相应问题得到解决.比如要加载B模块,但是B模块要求先加载A模块才能加载B模块,直接输入命令insmod会产生错误,而modprobe知道modules加载的先后顺序.一般推荐使用modprobe.加载模块完毕后输入lsmod可以查看已加载的驱动模块,输入ls /dev/video0可以查看加载的摄像头设备.无线网卡的移植类似.如果要卸载模块,调用modprobe -r hello或 rmmod hello[3].
Video4Linux是Linux内核提供给用户空间的编程接口,通过v4l提供的系统API来控制视频和音频设备,需要的就是使用这些系统的API.
采集流程见图3.
图 3 视频采集流程图
主要过程如下:typedef struct _v4l_struct v4l_device,1)打开视频设备.(通常是/dev/video0)int v4l_open(char *, v4l_device *);2)获得设备信息.int v4l_get_capability(v4l_device *vd),int v4l_get_picture(v4l_device *vd);3)设置设备信息.int v4l_set_picture(v4l_device *, int, int, int, int, int,);修改调色板、色深、亮度、对比度等;4)获得采集到的图像数据.a)直接读取设备int v4l_grab_picture(v4l_device *, unsigned int),b)使用mmap内存映射来获取图像,int v4l_mmap_init(v4l_device *),该函数调用vd->map指针把摄像头图像数据映射到进程内存中,即可采集到数据.int v4l_grab_frame(v4l_device *, int),该函数可以同时采集当前一帧数据和下一帧数据,真正完成图像采集.c)Int v4l_grab_sync(v4l_device *),d)使图像截取同步.最关键的一步即为调用ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)),调用后相应的图像就已经获取完毕.在截取图像后还要进行同步操作,就是调用extern int v4l_grab_sync(v4l_device *);5)处理采集的视频图像数据;6)关闭视频设备int v4l_close(v4l_device *vd)[4].
摄像头采集到数据后,由于实时视频数据量非常大,直接把数据传输到监控端需要占用很大的带宽,传输效率也会很低.因此就需要把数据编码压缩后再传输.本文采用的是基于DCT变换顺序的JPEG压缩编码算法.也可以采用H.264、MPEG系列标准的算法.流程见图4.
图4 JPEG编码流程
主要步骤:用DCT变换对8×8的图像去除数据冗余部分,再通过量化表对DCT系数量化,然后经过Huaffman编码,最后获得压缩数据,并测得压缩率为75%左右[5].
本系统采用网络套接字进行数据传输, 由于UDP协议无连接,不可靠,容易丢失数据,而TCP协议连接可靠,不丢失数据,所以选择TCP协议.
通信流程见图5.
图 5 通信流程图
程序分为服务器端和客户端,在服务器端,首先创建流式套接字socket(),bind()函数绑定服务器IP与socket,listen()函数处于监听模式.客户端也要先创建套接字,填充结构体,对服务器的发送连接请求connect().TCP三次握手完成后,服务器的程序将把视频缓冲区的视频数据拷到网络传输缓冲区,最后发送到客户PC机端[5].
在PC机端用QT开发监控画面,打开即可观察到监控画面,图像较为清晰.图6是截取的画面.
图 6 监控界面
经过测试,基于ARM的无线视频监控系统的设计方案实时性好、画面流畅、结构简单、操作方便、成本低,应用前景较为广泛.
[参考文献]
[1] 孙 弋. 基于S3C2440的嵌入式Linux开发实例[M]. 西安:西安电子科技大学出版社,2010.
[2] 赵晓军. 基于ARM的嵌入式无线视频监控系统[J]. 微型机与应用,2010(16):54-56.
[3] 宋宝华. Linux设备驱动开发详解[M]. 北京:人民邮电出版社,2010.
[4] 韦东山. 嵌入式Linux应用开发完全手册[M]. 北京:人民邮电出版社,2008.
[5] 孙 琼. 嵌入式Linux应用程序开发详解[M].北京:人民邮电出版社,2006.
[6] 许雪梅.基于ARM9+LINUX的无线视频监控系统的设计[J].计算机测量与控制,2010,18(11):2 475-2 477.