CAMSHIFT人脸跟踪算法改进及在Android平台的实现
2013-08-13熊玉虎李灯熬赵菊敏
熊玉虎,李灯熬,赵菊敏
(太原理工大学信息工程学院,山西 太原 030024)
随着计算机、数字图像处理等技术的发展以及人类社会的不断进步,计算机视觉已经进入了社会生活的各个方面。人脸检测和跟踪是人脸识别、图形控制、虚拟游戏和视频检索中的关键技术,其在安全验证系统、智能监控、视频会议、人机交互系统、电脑游戏制作、医学、档案管理等方面有着巨大的应用前景和市场潜力,并且人脸检测和跟踪的不断改进和创新正逐渐成为模式识别和人工智能的研究热点[1-2]。
人脸跟踪的好坏影响着人脸识别、口型分析、表情分析等后续处理的研究,本文针对传统CAMSHIFT人脸跟踪算法中存在的缺陷,引入亮度和饱和度信息以及运动预测估计信息,对传统算法进行改进,提高人脸跟踪的实时性和稳健性。同时,鉴于移动通信的快速发展,本文在Android系统平台下,利用JNI(Java Native Interface)和Android NDK(Native Development Kit),编译实现人脸跟踪应用程序。
1 CAMSHIFT算法
CAMSHIFT(Continuously Adaptive Mean Shift)算法是英特尔公司Microcomputer Research Lab的Bradski在1998年提出的,是由Mean Shift算法发展而来的。CAMSHIFT算法是一种基于颜色概率分布的非参数迭代技术连续自适应算法,它利用目标的颜色直方图模型对目标进行跟踪,具有较好的实时性和稳健性,其基本思想是:以视频序列图像的颜色概率直方图为基础,对各帧图像做Mean Shift运算以查找出运动目标,然后将上一帧得到的结果作为下一帧的模板,自适应调整搜索窗口的位置和大小,并对当前帧进行Mean Shift运算,定位出当前图像中目标的中心位置,以此迭代下去,就可以实现对运动目标的跟踪[3]。
1.1 CAMSHIFT 算法具体步骤[4]
图1所示为CAMSHIFT算法跟踪流程,该算法需要先将RGB颜色空间转化为HSV颜色空间(H表示色度,S表示饱和度,V表示亮度),再在HSV空间中提取H分量,并利用H分量的直方图建立颜色概率模型,然后以此概率模型为特征模板进行Mean Shift运算,实现对运动目标的跟踪。
利用CAMSHIFT算法进行人脸跟踪的具体步骤为:
1)初始化搜索窗口的大小和位置。
2)把输入的帧图像转换为HSV色彩模型,通过式(1)提取H分量,利用式(2)计算人脸区域的H分量颜色直方图,并将此颜色直方图作为待跟踪人脸的特征模板,此特征模板将用于后续每帧图像中的人脸跟踪。
图1 CAMSHIFT算法跟踪流程
3)利用人脸的特征模板对当前帧图像进行反向投影,通过式(3)计算获得当前帧图像的反向投影图I(x,y),即像素点(x,y)的像素值在H分量直方图中的概率值,如图2所示。
图2 反向投影
4)通过Mean Shift算法计算跟踪人脸新的质心位置
人脸是一个椭圆模型,比较适合的跟踪搜索窗口应该是椭圆形,因此人脸跟踪系统中通过式(5)求得人脸椭圆区域的长轴l、短轴w以及长轴的方向角θ
5)利用计算出来的人脸区域的位置和大小信息,初始化下一搜索窗,对下一帧图像进行Mean Shift人脸跟踪,返回步骤3)。
1.2 CAMSHIFT算法的不足
传统CAMSHIFT算法在实际应用中存在以下问题[5]:
1)在跟踪开始时需要手动初始化搜索窗,这样不仅降低了算法的效率,而且也引入了主观误差。
2)在简单背景环境中,CAMSHIFT算法可以取得较好的跟踪效果;但是在复杂背景环境中,尤其是存在大面积相似背景颜色干扰时,跟踪效果会受到较大影响。
3)缺乏对跟踪目标的运动预测估计,当在跟踪过程中目标被遮挡时,会造成跟踪失败。
4)CAMSHIFT计算直方图的方法没有滤除干扰的能力,HSV色彩空间中仅仅依靠H分量不能完全区分与人脸色度相近的信息,当饱和度S过低,亮度V过低或过高时,H分量容易受到噪声的干扰,影响跟踪的效果。
2 CAMSHIFT算法的改进
2.1 引入Adaboost人脸检测算法
由于CAMSHIFT算法需要手动选取初始化搜索窗,且没有对物体进行学习的能力。因此,本文采用较成熟的基于Adaboost算法的人脸检测器快速获取人脸的位置和大小信息,并将其传递给CAMSHIFT算法,从而实现人脸跟踪初始搜索窗的自动选取。
2.2 引入饱和度S和亮度V信息
在人脸跟踪过程中,由于光照和阴影等的影响,饱和度S和亮度V有所不同,会对色度H产生干扰,使H分量包含的信息无法完全区分和人脸相近的区域。因此,文中通过式(6)加入S分量信息和V分量信息,由H分量作为主要颜色特征,S分量和V分量作为次要颜色特征建立颜色模型,以滤除H分量中的噪声信息。
图3所示为融合H,S,V分量后的人脸跟踪过程,具体步骤如下:
图3 融合H、S、V分量的人脸跟踪过程
1)分别计算H,S,V分量的颜色直方图。
2)通过直方图反向投影来获取当前帧的概率分布图Ih,Is,Iv。
3)利用式(7)计算总的概率分布图Ic
式中:α表示H分量对颜色信息的贡献,β和γ表示S和V分量对颜色信息的贡献,且α+β+γ=1,α∈[0.5,1],β,γ∈[0,0.5]。
2.3 引入运动预测估计信息
在人脸跟踪过程中,为了防止目标丢失,本文中对CAMSHIFT算法输出的质心坐标进行估计预测,用得到的预测信息更新下一帧的搜索窗口,以提高跟踪的可靠性与有效性。
考虑运算效率,本文采用简单运动预测估计。假设运动目标在短时间内匀速运动,从第i帧的目标中心点( xi,yi)到第i+1帧的目标中心点 ( xi+1,yi+1)在水平和垂直方向上的位移分别为Δxi和Δyi,则有
此外,人脸椭圆区域的长轴为l、短轴为w,设置阈值Δl、Δw,使跟踪窗口的大小保持在(l-Δl<L<l+Δl,w-Δw<W <w+Δw)范围之内。当跟踪窗口大小超过这个范围时,就表示其受到背景噪声的干扰,然后强制把搜索窗口的大小约束到这个范围之内。
3 实验结果与分析
在Windows 7系统下,利用 VC++2010和OpenCV2.4.2搭建软件平台对改进CAMSHIFT人脸跟踪算法进行实验验证。图4所示为改进算法在角度变化、纸张和类肤色干扰等不同条件下的跟踪效果,与图5传统CAMSHIFT跟踪对比可以看出,改进算法提高了人脸跟踪的有效性和可靠性。此外,引入饱和度和亮度信息后,能有效地将与人脸色度信息相近的噪声干扰滤除掉,增强跟踪的稳健性,如图6所示。
4 实现人脸跟踪Android应用程序
4.1 开发环境的搭建
Android应用程序开发环境的搭建参见文献[7],但本文采用官方提供的版本android-ndk-r8-windows。从r7开始,在Windows环境下不需要下载Cygwin来模拟Linux环境,Windows版本的NDK提供了一个ndk-build.cmd脚本,只要为Eclipse Android工程添加一个Builder,就可以直接利用这个脚本实现Eclipse自动编译NDK。此外,本文采用官方提供的 OpenCV-2.4.2-android-sdk,OpenCV函数库已被打包成备用的Android Library Project,将其导入到Eclipse工作空间就可在项目中引用OpenCV库函数[8-9]。
4.2 实现过程
Android应用程序的开发以Java为编程语言,Android NDK允许开发者使用C/C++作为编程语言来为Android开发应用程序;JNI是一套双向的接口,允许Java与本地代码间的互操作。因此,本文利用JNI编写本地C/C++代码,并采用Android NDK进行编译,这样可以让Java程序与本地代码分别运行在不同的进程中,一个进程的崩溃不会立即影响另一个进程[9-10]。
新建Android工程项目Facetracting,再在项目中添加OpenCV函数库OpenCV-2.4.2,然后可以开始编写应用程序。如图7所示,利用JNI和Android NKD开发应用程序的过程如下。
图7 利用NDK和JNI开发应用程序的实现过程
1)利用Android应用程序框架编写Java端代码。
首先在AndroidManifest.xml文件中对使用的Activity和Camera App进行声明;再在项目包com.myDemo.facetracting中新建Java源文件FaceViewBase.java和Face-View.java,在FaceViewBase类中设置camera的使用和对帧图像数据的处理,FaceView继承于FaceViewBase,在FaceView类中声明人脸跟踪操作的native方法,要使用native方法就要通过System.loadLibrary()方法对动态库进行加载;最后在项目包中新建2个Activity:MainActivity和FaceActivity,通过Intent由MainActivity启动FaceActivity,在 FaceActivity中通过 setContentView将 FaceActivity显示的View设置为FaceView的内容。
2)通过JNI编写本地C/C++代码,利用Android NDK对其进行编译,生成Java端可调用的共享库。
首先在工程目录中新建文件夹jni,将由“javah”命令生成的包含native方法的头文件拷贝在该文件夹中;然后编写jni_part.cpp文件,在该文件中必须要使用jni.h头文件,再实现Java端声明的native方法中的函数;最后编写脚本文件Android.mk和Application.mk,通过脚本文件才能在NDK编译后生成供Java端调用的共享库。
3)通过Android SDK生成可发布的Android应用程序APK包。
在eclipse中用Android SDK编译后,就会在bin目录中生成Facetracting.apk文件,该文件就是可发布的APK包,将其安装在使用Android系统的手机上,其运行效果如图8所示。
图8 人脸跟踪在Android手机上的实现过程
5 小结
本文的算法在传统CAMSHIFT人脸跟踪算法中加入亮度、饱和度信息以及运动预测估计信息,可滤除与人脸色度相近的干扰信息,对跟踪目标搜索窗位置的预测和调整,提高了算法对跟踪的稳健性。同时,在Android平台下,通过OpenCV函数库的辅助,利用JNI和NDK进行人脸跟踪的开发,使视频的采集和对图像的处理运行在不同进程中,实现了在Android手机上的人脸跟踪应用。在更加复杂环境背景中的人脸跟踪是今后深入研究的重点,此外,随着Android系统和移动设备硬件的发展,开发人员可进一步提高人脸跟踪在Android系统中应用的实时效果。
[1]何炜.自适应运动目标检测和跟踪技术研究[D].昆明:云南大学,2011.
[2]王亮亮,孙即祥.基于人脸检测和CAMSHIFT算法的人脸跟踪系统[J]. 微计算机应用,2008,29(2):14-17.
[3]吴海江,李一民,潘晓露,等.改进的Camshift跟踪算法研究[J].微处理机,2011,32(2):35-37.
[4]GARY R.Computer vision face tracking for use in a perceptual user interface[EB/OL].[2012-09-20].http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.14.7673.
[5]邬大鹏,程卫平,于盛林.基于帧间差分和运动估计的Camshift目标跟踪算法[J]. 光电工程,2010,37(1):55-60.
[6]丁志辉,李毅.基于Camshift算法的运动目标检测[J].电脑知识与技术,2009,12(5):10532-10533.
[7]王宏彬,李灯熬,赵菊敏,等.利用OpenCV实现在Android系统下的人脸检测[J]. 软件,2011(12):4-7.
[8]OpenCV WiKi[EB/OL].[2012-09-20].http://opencv.willowgarage.com/wiki/Welcome.
[9]Android Guide[EB/OL].[2012-09-20].http://developer.android.com/guide/index.html.
[10]Java Native Interface[EB/OL].[2012-09-20].http://en.wikipedia.org/wiki/Java_Native_Interface.