摘 要: 详细描述了在ARM-Linux嵌入式系统中移植OpenCV的方法,并在OpenCV的基础上运用Surendra算法设计了一个结合监控和运动目标跟踪功能的网络视频监控系统。
关键词: 视频监控;ARM-Linux嵌入式系统;OpenCV;Surendra算法
近年来,公共场所的安全防范问题得到了越来越多的关注,一些视频监控系统也日益重要起来。嵌入式系统的硬件集成化程度高,软件采用实时多任务操作系统和相应的应用软件,软硬件均可裁减。随着大规模集成电路的发展,ARM处理器的速度也越来越快,以ARM处理器为核心的嵌入式平台在视频监控方面具有很大的优势[1]。本文详细描述了在ARM-Linux嵌入式系统中移植OpenCV的方法,并在此基础上运用Surendra算法设计了一个结合监控和运动目标跟踪功能的网络视频监控系统。
1 OpenCV简介
OpenCV是由Intel公司发起并参与开发且在近年来迅速普及的计算机视觉研究工具,是一个跨平台的计算机视觉库[2]。OpenCV可以在Windows、Linux以及Android等系统上运行,Intel公司免费开放该函数库的源代码。OpenCV提供了非常丰富的帧提取函数和视觉处理算法,开发者可以在其视频开发项目中直接调用进行算法移植并添加自己编写的程序,即可完成复杂庞大的开发任务,达到事半功倍的效果[3]。
2 系统硬件构架
系统基于客户端/服务器的模式运行。服务器采用Mini2440开发板,该开发板基于ARM9内核,安装了Linux-2.6.32内核的Linux操作系统,微处理器采用Samsung S3C2440,采用专业的CPU内核电源芯片和复位芯片以保证系统的稳定性,最高主频为533 MHz。客户端为普通PC,在PC上安装Fedora11操作系统和OpenCV函数库,客户端通过网络同时接收来自多个服务器的视频数据[4-5]。整个系统的硬件结构如图1所示。
3 移植OpenCV函数库
最终的目标是要在ARM嵌入式平台上实现系统监控和跟踪功能,故需要交叉编译在ARM-Linux平台上移植OpenCV函数库[6]。移植过程如下:
(1)获取OpenCV源代码后解压,在当前目录下输入如下命令:./configure
--host=arm-linux --without-gtk
--without-carbon --without-quicktime
--without-ffmpeg --without-python
--without-swig --enable-static
--enable-share --disable-apps
CXX=arm-linux-g++ CC=arm-linux-gcc
--prefix=/usr/local/opencv
&make &make install
(2)设置环境变量:export PKG_CONFIG
_PATH=$PKG_CONFIG_PATH:/usr/local/opencv/lib/pkgconfig。编译OpenCV源代码自带的例程,测试OpenCV函数库移植是否成功。因为在移植OpenCV函数库时没有添加对gtk的支持,故在编译例程drawing.c时要去掉与显示相关的函数。使用命令:arm-linux-gcc drawing.c-o drawing′pkg-config--cflags opencv′′pkg-config--libs opencv′,生成可执行文件drawing。
(3)在OpenCV安装路径/usr/local/opencv下,把lib文件夹里的库文件拷贝到ARM-Linux平台的文件系统里。运行可执行文件drawing,如果在ARM-Linux平台上成功执行,则表示OpenCV函数库移植成功。
4 嵌入Surendra算法
网络视频监控系统是通过摄像头获取图像,对获取到的图像进行处理确定运动目标,若发生异常情况,系统会自动发出警告并启动录像功能进行录制保存。运动目标检测是该系统的核心,是实现运动目标识别和跟踪的基础。对比各种运动目标检测算法,同时根据系统处理器的运算能力,本文选用Surendra背景更新算法作为运动目标的检测算法[7]。
Surendra算法能够自适应地获取背景图像,其基本思想是通过当前帧帧差图像找到物体的运动区域,保持该区域内的背景不变,用当前帧更新非运动区域的背景,经过迭代运算后就可以提取出背景图像,实现自动更新[8]。Surendra算法步骤如下:
运动目标的检测就是在当前帧图像中提取运动目标,而一般情况下前景的运动目标与背景的灰度值有很大的差异,但运动物体本身的灰度值差异一般不会很大。因此背景差分二值图像为:
其中,Ii为当前帧图像,Bi为背景图像。差分二值图像的灰度值为255的像素点可视为前景的运动目标点。通过比较这些点的个数变化是否在一定的阈值内可以判断是否有运动物体进入监控区域。
在图像处理中,不同类型的图像内部结构不同,需要根据图像的结构采用不同的方法将图像数据读入内存[9]。OpenCV的API函数cvCaptureFromCAM可以将图像数据从摄像头中加载进来,图像结构类型使用IplImage结构体来表示。cvCaptureFromCA的函数原型为:CvCapture*cvCaptureFromC AM(int index),它返回值为一个指向CvCapture结构体的指针,然后通过调用API函数cvQueryFrame(CvCapture*capture)返回得到一个指向IplImage结构体的指针,采集进来的图像信息就保存在IplImage结构体中。IplImage结构体的width、height、widthStep成员分别指示了图像的宽像素数、高像素数、排列图像的行大小,指针参数imageData指向了实际的图像数据。图像数据可以看作一个二维矩阵,相应的处理可以看作对一个二维矩阵的处理,对图像进行嵌入Surendra算法开发主要就是对imageData指向的数据进行操作[10]。在实际开发中,为了减轻处理器的运算压力,嵌入Surendra算法是以当前帧的前4帧图像作为背景图像,即Ii和Ii-4分别代表当前帧和前一帧图像,然后依据Surendra算法原理对两帧图像求帧差分并进行二值化,最终检测出运动物体。
5 客户端/服务器设计
系统软件设计采用客户端/服务器的模式结合Linux多线程的编程方法,使整个系统能够流畅地实现多用户的接入和切换。每个作为服务器的ARM嵌入式平台上外接一个USB摄像头,分布于监控点上的多个服务器通过网络连接到作为客户端的PC上,由此构成了整个网络监控系统[11]。在系统中使用IP地址作为服务器的编号,用来区分来自于不同监控点上传送来的视频信息。
系统软件由两部分组成,分别是基于ARM嵌入式平台上的服务器端和基于PC上的客户端[12]。服务器端需要完成3个基本任务,即图像获取、图像处理和处理后图像数据的网络发送。在软件设计上,使用3个线程实现这3个任务,在线程之间采用互斥锁的机制对关键数据进行保护和实现线程之间的同步,以保证系统的平稳、流畅运行。图像获取线程与图像处理线程之间、图像处理线程与图像发送线程之间共同维护了两个缓冲区img1和img2,图像数据基于流水线的模式由USB摄像头采集进来经处理后再通过TCP/IP网络发送出去[13-14]。服务器端的运行机制如图2所示。
可看到缓冲区img1和img2分别有两个线程拥有权限对其进行操作,如果两个线程同时对数据进行读写,就会出现竞争现象,进而破坏数据的完整性。针对这种情况,采用了Linux互斥锁的机制,控制程序在对缓冲区进行读写操作时永远只会响应一个线程的操作请求,如在图像获取线程与图像处理线程之间采用如下处理:
……
data_process=0;
pthread_mutex_lock(&mutex);
……//算法处理代码
data_process=1;
pthread_mutex_lock(&mutex);
………
运用这样的方法就可以对数据在特定时间进行保护,同时也可以实现线程之间的同步,非常有利于系统的流畅运行。图像获取线程每秒从USB摄像头中采集30帧的数据。为了提高处理速度,选择灰度图像处理,大大减少了ARM处理器的工作量,提高了系统的运行效率。
相对于服务器端,客户端在实现上简单很多。客户端构建在PC上,只需要完成图像数据的网络接收和图像显示两个基本任务。它们由两个线程来实现,两个线程之间共同维护一个缓冲区,也是采用互斥锁的机制对数据在特定时间进行保护。用户通过IP地址作为编号识别不同的服务器端,在计算机上可以对关心的区域进行实时的远程监控和跟踪。
本系统成功地将OpenCV函数库移植到ARM-Linux嵌入式系统中,并基于OpenCV函数库和Surendra算法开发与实现了一个嵌入式网络视频监控系统。在系统运行的过程中,每秒从USB摄像头中采集30帧的图像数据,每4帧图像之间进行一次算法处理,即相当于每间隔0.13 s进行一次Surendra算法处理。这样不但减轻了处理器的运算压力,同时也能满足系统对视频连续性与运动物体检测的要求。
参考文献
[1] 陈艳华,侯安华,刘盼盼.基于ARM的嵌入式系统开发与实例[M].北京:人民邮电出版社,2008.
[2] Intel Corporation. OpenCV reference manual[S/OL]. (2001)[2001].http://www.intel.com.
[3] 刘瑞帧,于士琪.OpenCV教程——基础篇[M].北京:北京航空航天大学出版社,2007.
[4] 周香珍,芮筱亭,张顺.基于DSP的运动目标跟踪系统的实现[J].微计算机信息,2008(23):189-191.
[5] 汪爱丽,刘孟洪.基于ARM的嵌入式网络监控系统构建[J].微处理机,2009(5):59-60.
[6] 尹俊超,刘直芳.基于OpenCV的运动目标检测与跟踪[J].计算机工程与设计,2011,32(8):2817-2820.
[7] 汪成亮,贾亮亮.一种基于改进Surendra背景更新算法的运动目标检测[J].世界科技研究与发展,2012,34(2):272-275.
[8] 徐方明,卢官明.基于改进surendra背景更新算法的运动目标检测算法[J].山西电子技术,2009(5):39-40,71.
[9] 阮秋琦.数字图像处理学[M].北京:电子工业学院,2007.
[10] 贾永红,张谦.数字图像处理实习教程[M].武汉:武汉大学出版社,2012.
[11] 唐人财,刘连浩.基于嵌入式Linux远程图像监控系统的设计[J].计算机与现代化,2010(11):31-34,38.
[12] 谌洪茂,徐猛华.基于嵌入式远程监控系统的设计[J].计算机与现代化,2004(2):86-88.
[13] 方晓翠,周渊平,王小红.嵌入式远程视频监控系统的设计[J].通信技术,2011,44(10):105-108.
[14] 王秀芳,张昆,桑圣洁.基于ARM的图像监控系统的开发[J].科学技术与工程,2011,11(14):3313-3317,3321.