下面描述Mastering OpenCV里的第六章非刚性人脸跟踪个人总结
其实这章已经有人发布了不错的博客
传送门:http://blog.csdn.net/jinshengtao/article/details/42614091
楼上大神贡献的代码链接 http://download.csdn.net/detail/jinshengtao/8555713
这边主要我自己总结的一些上面博客讲的不是很清楚的部分和一些自己的总结
下面就直接识别部分和模型性质的解析,其他比较简单
int
face_tracker::
track(const Mat &im,const face_tracker_params &p)
{
//把图片转成灰度
Mat gray;
if(im.channels()==1)
gray = im;
else
cvtColor(im,gray,CV_RGB2GRAY);
//initialise,为第一帧或下一帧初始化人脸特征
if(!tracking)
points = detector.detect(gray,p.scaleFactor,p.minNeighbours,p.minSize);
if((int)points.size() != smodel.npts())
return 0;
//fit,通过迭代的方式,估计当前帧中的人脸特征点
for(int level = 0; level < int(p.ssize.size()); level++)
points = this->fit(gray,points,p.ssize[level],p.robust,p.itol,p.ftol);
//set tracking flag and increment timer
tracking = true;
timer.increment();
return 1;
}
下面链接是一个索引,文章都是个人的理解
综述了自己的认识,可能不是很好理解
这个函数就是识别的全部过程,将图像im和配置p传入最后的points 就是得到的脸部特征点的位置
第一步:转灰度图
第二步:为第一帧或下一帧初始化人脸特征
初始化人脸特征训练和使用
http://blog.csdn.net/limit_ing/article/details/61961017
第三步:fit函数通过形状模型和图像匹配模型得到最匹配的点
其中涉及三个模型的训练和使用:
1、形状模型
形状模型的训练和性质
http://blog.csdn.net/limit_ing/article/details/62318945
形状模型的使用
http://blog.csdn.net/limit_ing/article/details/62318945
2、块匹配模型
块训练–图像块提取和梯度下降
http://blog.csdn.net/limit_ing/article/details/62117479
块矫正点
http://blog.csdn.net/limit_ing/article/details/62969269
3、比例模型
一、初始化特征点的位置
1、使用CascadeClassifier的detectMultiScale函数检测出人脸位置矩形区域
2、使用之前训练的脸部比例粗略恢复人脸特征点位置
二、纠正偏差
1、使用形状模型的误差模块纠正偏差太厉害的形状
2、根据上面形状检测的点使用块匹配模型在多个大窗口中多次匹配找到最合适的点
多个窗口重复检测增加检测的精确性
纠正偏差的过程是在视频中不断进行的一个迭代过程
总的来讲比例模型只是在初始化的时候初始下主要的特征点位置
纠正偏差是在视频跟踪中不断迭代的过程,如果人脸位置变动太大就只能重新检测位置了