OpenCV与Compressive Tracking实现人脸的实时检测与跟踪

最近一直在关注压缩传感方面的东西,正好看到一篇新论文《Real-Time Compressive Tracking》。作者将压缩感知与图像跟踪结合起来,实现了有效的降维,最后只用一个简单的朴素贝叶斯分类器就实现了非常鲁棒的跟踪效果,值得一提的是,这个算法的实时性非常好,在320×240的分辨率下能达到40fps左右的速度。具体论文和代码可以参看作者的网页http://www4.comp.polyu.edu.hk/~cslzhang/CT/CT.htm

有这么好的东西,怎么能抑制住我激动的心情呢,于是总在找机会实现并使用一下这个算法。

最近需要一个在室外能知道人位置的设备,当初考虑Kinect,但由于白天室外的热光源较多,很容易致盲Kinect。于是转向传统的摄像头。自然地就产生的人脸检测+跟踪的想法。


人脸检测:

目前主流的人脸检测方法就是Viola-Jones等人提出的Haar-like Feature Boost方法。该方法速度快,准确度高,再加上OpenCV中有该方法的实现(CascadeClassifier类),使用起来非常方便。下图是识别结果。



做完人脸识别后,到户外去测试,发现算法除了识别到人之外,还将一些非人类的东西识别为人,比如一些树叶密集的地方。既然Boost算法的思想就是多个弱分类器组成强分类器,我们也自然的类推一下,用多个级联检测器确定人脸。于是我又加入了对鼻子和嘴的检测器,当人脸检测器拿到所有候选人脸的位置后,再使用鼻子和嘴检测器检测候选区域,当这两种检测器都检出,或其中一个检出时,我们就可以判定这是人脸,而其他的是非人脸。通过这种方法,有效的降低了算法的错误接受率。



人脸跟踪:

跟踪方法有许多,常用的有CamShift、粒子滤波等等。但之前我说了,我很想找个机会使用CT(Compressive Tracking)算法,现在机会来了。

人脸检测器返回的是一个包围人脸的矩形,这刚好可以作为CT的初始化输入。CT的代码我是从作者的网页上下载的,为了更好的配合我们的目的,我做了一些修改。当跟踪的人离开视野后,必须停止跟踪并重置CT的贝叶斯模型,然后重新启动人脸检测器去检测新的人脸,得到新的人脸后再启动CT去跟,以此类推。研究了一下CT的代码后,发现贝叶斯分类器是有一个分数输出的,作为对匹配程度的度量,就是下面代码中的radioMax。

  1. //processFrame函数中的代码  
  2. // predict  
  3.     sampleRect(_frame, _objectBox, rSearchWindow,detectBox);  
  4.     integral(_frame, imageIntegral, CV_32F);  
  5.     getFeatureValue(imageIntegral, detectBox, detectFeatureValue);  
  6.     int radioMaxIndex;  
  7.     float radioMax;  
  8.     radioClassifier(muPositive, sigmaPositive, muNegative, sigmaNegative, detectFeatureValue, radioMax, radioMaxIndex);  
  9.     _objectBox = detectBox[radioMaxIndex];  

该值越大,匹配程度越高,经过测试,高匹配值一般在100左右,于是我们可以设定一个阈值,比如50。当贝叶斯分类器返回的分数小于该阈值时,就停止跟踪并重置分类器,然后启动人脸检测。当然这种方法存在一个问题,如果被跟踪的人突然被某个东西遮挡了一下,跟踪就停止了,而且很难保证检测器再次检测到该人。这里有一个简单但有效的解决方法,我们可以在跟踪目标移动到视场边缘时,才进行阈值判断,而其他情况下不做任何事情,尽力发挥CT的高鲁棒性!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值