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

转载 2015年07月14日 15:46:51

最近一直在关注压缩传感方面的东西,正好看到一篇新论文《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的高鲁棒性!

相关文章推荐

卡尔曼滤波+opencv 实现人脸跟踪 小demo

#include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/...
  • lcj1105
  • lcj1105
  • 2015年11月21日 15:58
  • 3931

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

OpenCV例子四:摄像头实时人脸检测

#include "stdafx.h" #include #include // Gaussian Blur #include // Basic OpenCV structure...

opencv实现摄像头实时人脸检测

昨天晚上在大神的带领下领略了opencv的风采,搞得我都想换行搞机器视觉了,这个库真的太好用了,用很简单的代码就能写出自己的人脸检测程序。 我把程序直接贴出来,大家一次讨论学习,平台是opencv2...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

人脸跟踪(方法总结)

人脸跟踪(方法总结)

(学习笔记)第六章 非刚性人脸跟踪——Face tracking(人脸跟踪)

(学习笔记)第六章 非刚性人脸跟踪——Face tracking(人脸跟踪) 转载请注明:http://blog.csdn.net/raby_gyl/article/details/14452471...
  • lphbtm
  • lphbtm
  • 2016年02月02日 09:22
  • 2203

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

请看最Robust的人脸跟踪算法!

opencv--读取摄像头识别人脸并跟踪

VS上的程序 #include "stdafx.h" #include "cv.h" #include "highgui.h" #include "windows.h" #include ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV与Compressive Tracking实现人脸的实时检测与跟踪
举报原因:
原因补充:

(最多只允许输入30个字)