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--读取摄像头识别人脸并跟踪

VS上的程序 #include "stdafx.h" #include "cv.h" #include "highgui.h" #include "windows.h" #include ...
  • imxiangzi
  • imxiangzi
  • 2016年04月28日 22:37
  • 4745

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

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

OpenCV人脸跟踪canny边缘检测

为了学习图像检测技术,把开源的OpenCV拿来研究,刚刚能用它监测人脸位置. OpenCV的源码和安装包都在Sourceforge中可以搜到: http://sourceforge.net...
  • imxiangzi
  • imxiangzi
  • 2016年04月28日 22:36
  • 2242

opencv 2.4.9+vs2013 人脸识别环境搭建,眼睛,鼻子,嘴巴等 摄像头读取和显示

读取摄像头:int main( int argc, char** argv ) { //int i=0; cvNamedWindow( "Example2_9", CV_WI...
  • wgf5845201314
  • wgf5845201314
  • 2017年09月29日 14:24
  • 1152

opencv人脸检测和跟踪

一、我的分类训练器的xml文件路径如下: D://opencv//sources//data//haarcascades//haarcascade_frontalface_alt.xml 每个人的安...
  • qq_29540745
  • qq_29540745
  • 2016年07月18日 11:14
  • 855

【安卓随笔】使用OpenCV进行人脸跟踪和自动拍照

众所周知,其实在安卓原生的方法里,已经具备谷歌的人脸检测算法,只需要传入一张图片,即可获取其中人脸的个数以及两眼之间的距离等信息,如果这些谷歌的算法真的非常强大的话,也就没有必须写这篇博文了,用过的同...
  • vicemiami
  • vicemiami
  • 2017年01月10日 15:15
  • 3951

OpenCV+VideoInput 捕捉摄像头+人脸检测

【概述】 笔者用的环境是笔记本Win7+VS2010+OpenCV2.2     当利用OpenCV的cvCreateCameraCapture(0)、cvQueryFrame( pCapture...
  • debug__boy
  • debug__boy
  • 2012年11月17日 20:50
  • 10715

pcduino+opencv实现人脸追踪摄像头

Pcduino是一款兼容Arduino接口的mini pc,A8架构1Ghz的CPU,计算能力不俗,用来跑OpenCV刚刚好。这里就用他们实现一个可以跟随人脸移动的摄像头。 硬件清单: 1、Pcdu...
  • u011448926
  • u011448926
  • 2013年12月14日 11:52
  • 1156

OPENCV中人脸检测与camshift跟踪算法加了进去

  • 2013年03月07日 15:31
  • 251KB
  • 下载

OPENCV人脸跟踪代码

  • 2013年03月14日 16:05
  • 6KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV与Compressive Tracking实现人脸的实时检测与跟踪
举报原因:
原因补充:

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