本文中的知识来自于Mastering  opencv with practical computer vision project一书。

    本文实施的脸部跟踪算法都是基于数据驱动的,主要包括两个部分,训练和测试。训练就是通过脸部标记点的采样数据,训练得到一个标准的脸部模型,而测试部分就是把检测到的脸部和标准脸部模型比较,求得眼睛,鼻子等脸部特征。具体来讲,脸部跟踪分为三个部分:shape model形状模型,就是训练数据表示为什么样的形状模型;feature detector特征检测,检测目标脸中的特征;fitting algorithm适应算法,就是匹配算法,匹配检测到的目标特征点和训练的形状模型结果。

一、训练数据准备

        从http://www.milbo.org/muct/下载训练数据集,该数据集包括3755张人脸图像,以及人脸特征点标记文件。人脸特征点标记文件中,包括所有图像的特征点标记,每副图像76个特征点。解压下载的压缩文件后,图像文件都在jpg目录中,另外我们得到文件muct76-opencv.csv,该文件中保存的都是图像的特征点标记。

      打开文件muct76-opencv.csv,我们得到下面数据,第一列为图像文件名,从第三列开始为76个特征点的x,y坐标。

name,tag,x00,y00,x01,y01,x02,y02,x03,y03,x04,y04,x05,y05,x06,y06,x07,y07,x08,y08,x09,y09,x10,y10,x11,y11,x12,y12,x13,y13,x14,y14,x15,y15,x16,y16,x17,y17,x18,y18,x19,y19,x20,y20,x21,y21,x22,y22,x23,y23,x24,y24,x25,y25,x26,y26,x27,y27,x28,y28,x29,y29,x30,y30,x31,y31,x32,y32,x33,y33,x34,y34,x35,y35,x36,y36,x37,y37,x38,y38,x39,y39,x40,y40,x41,y41,x42,y42,x43,y43,x44,y44,x45,y45,x46,y46,x47,y47,x48,y48,x49,y49,x50,y50,x51,y51,x52,y52,x53,y53,x54,y54,x55,y55,x56,y56,x57,y57,x58,y58,x59,y59,x60,y60,x61,y61,x62,y62,x63,y63,x64,y64,x65,y65,x66,y66,x67,y67,x68,y68,x69,y69,x70,y70,x71,y71,x72,y72,x73,y73,x74,y74,x75,y75
i000qa-fn,0000,201,348,201,381,202,408,209,435,224,461,241,483,264,498,292,501,319,493,338,470,353,448,363,423,367,395,366,371,357,344,355,316,340,311,325,318,309,328,327,324,342,317,217,328,231,323,250,327,269,333,251,334,233,331,229,345,240,337,262,349,242,352,241,344,346,337,330,330,318,341,334,344,330,336,280,344,278,381,264,399,273,406,293,409,316,399,321,392,304,376,296,342,279,402,310,399,251,431,268,427,284,425,293,425,302,423,316,425,329,426,320,442,309,451,295,454,278,452,263,442,277,440,293,442,313,437,313,429,293,432,277,431,293,436,295,395,234.5,341,251,343,252,350.5,235.5,348.5,338,333.5,324,335.5,326,342.5,340,340.5

...

比如第二行数据,即为图像i000qa-fn.jpg的特征点标记,标记显示出来即为下图的效果:

二、得到yaml格式的数据文件

训练脸部跟踪算法的数据有四部分:

1、图像

2、标记点

3、标记点的对称索引

4、连通性索引

      imnames向量中存放的是图像文件的名字,imnames的size即为样本图像的数量。points中存放的是标记点,每副图像对应76个标记点,所以它采用二维vector的方式定义。symmetry中存放的是points中点的索引,它指定points中那些点需要镜像。

vector<int> symmetry;                   //对称点索引,标指出那些特征点需要镜像
vector<Vec2i> connections;               //连通点索引,两个索引指定2个点的连通关系。
vector<string> imnames;                  //图像

vector<vector<Point2f> > points;      //标记点

最后我们把训练数据保存在yaml文件中,shapes的每一列表示一副图像的76个特征点x、y坐标。

最后生成的数据文件为annotations.yaml内容为:

%YAML:1.0
ft object:
   n_connections: 47
   connections 0 0: 21
   connections 0 1: 2

   ....

n_symmetry: 76
symmetry 0: 1
symmetry 1:

...

n_images: 2914
image 0: "..\\muct\\jpg\\i000qa-fn.jpg

...

shapes: !!opencv-matrix
   rows: 152
   cols: 2914
   dt: f
   data: [ 201., 157., 201., 187., 145., 182., 190., 152., 191., 162.,
       110., 140., 118., 164., 166., 114., 135., 123., 168., 166.,
       113., 143., 123., 168., 224., 183., 230., 221., 182., 226.

...

程序源代码:工程FirstOpenCV39

程序运行后,会从muct76-opencv.csv中把标记点读入到class ft_data中,之后会把它写入annotations.yaml。然后提示我们用鼠标选取连通性,选取完后,按q键,会把连通信息保存到annotations.yaml中,之后进入选取需要对称的标记点界面,我们可以用鼠标点击需要镜像的标记点,按q键后,保存到annotations.yaml文件中。

注意程序执行时带的两个参数为:-m ..\muct\jpg\ -d ..\muct\out\

其中-m指定输入图像的目录,-d 指定输出ymal文件的目录。

    我们在solution文件同层目录建立muct目录,里面包括子目录jpg,存放图片文件,子目录muct-landmarks中包括文件muct76-opencv.csv,out子目录为输入yaml文件的目录。

OpenCV 脸部跟踪(1)的更多相关文章

  1. OpenCV 脸部跟踪(2)

          前面一篇文章中提到,我们在一副脸部图像上选取76个特征点,以及这些特征点的连通性信息来描述脸部形状特征,本文中我们会把这些特征点映射到一个标准形状模型.       通常,脸部形状特征点能 ...

  2. OpenCV 脸部跟踪(3)

       前面一篇文章我们生成了脸部特征的线性形状模型,本章来学习一下显示线性形状的代码. 线性模型类的结构如下: class shape_model     {                      ...

  3. python + opencv: kalman 跟踪

    之前博文中讲解过kalman滤波的原理和应用,这里用一个跟踪鼠标的例程来演示怎么在opencv里用自带的kalman函数进行目标跟踪,文章的内容对做图像跟踪有借鉴意义.文章主要是网络资源进行整理和简单 ...

  4. Opencv目标跟踪—CamShift算法

    CamShift算法全称是"Continuously Adaptive Mean-Shift"(连续的自适应MeanShift算法),是对MeanShift算法的改进算法,可以在跟 ...

  5. Opencv人头跟踪检测

    //-------------------------------------人头检测------------------------------------- int main(){     //V ...

  6. opencv视频跟踪2

    在前面的报告中我们实现了用SURF算法计算目标在移动摄像机拍摄到的视频中的位置.由于摄像机本身像素的限制,加之算法处理时间会随着图像质量的提高而提高,实际实验发现在背景复杂的情况下,结果偏差可能会很大 ...

  7. OpenCV人脸特效制作

    https://blog.csdn.net/zxc024000/article/details/50456917 https://blog.csdn.net/huanghuangjin/article ...

  8. OpenCV面、人眼检测

    /* 功能:实现对眼睛.脸部的跟踪. 版本号:1.0 时间:2014-4-27 */ #include <opencv2/objdetect/objdetect.hpp> #include ...

  9. OpenCv 人脸检測的学习

    近期公司要组织开发分享,可是自己还是新手真的不知道分享啥了,然后看了看前段时间研究过OpenCv,那么就分享他把. openCv就不介绍了,说下人脸检測.事实上是通过openCv里边已经训练好的xml ...

随机推荐

  1. Windows下安装mysql cluster

    0.mysql集群介绍 浅谈mysql集群——http://blog.csdn.net/chenxingzhen001/article/details/7708663: 官网——http://dev. ...

  2. Block的基本用法

    NSString* (^myBlock)(NSString*, int); myBlock = ^(NSString *name, int age){ return [NSString stringW ...

  3. 决策树算法(Bagging与随机森林)

    Bagging算法: 将训练数据集进行N次Bootstrap采样得到N个训练数据子集,对每个子集使用相同的算法分别建立决策树,最终的分类(或回归)结果是N个决策树的结果的多数投票(或平均). 其中,B ...

  4. bzoj1211: [HNOI2004]树的计数 prufer编码

    题目链接 bzoj1211: [HNOI2004]树的计数 题解 prufer序 可重排列计数 代码 #include<bits/stdc++.h> using namespace std ...

  5. 优客365 v2.9版本 后台存在SQL注入

    安装 打开后台登陆界面 http://localhost:9096/yk365/system/login.php 输入单引号报错 得到表名 经过跟踪后在\module\login.php文件出现错误 ...

  6. [COGS2580]偏序 II

    [COGS2580]偏序 II 题目大意: \(n(n\le50000)\)个五元组,求五维偏序. 思路: CDQ分治套CDQ分治套CDQ分治套树状数组. 时间复杂度\(\mathcal O(n\lo ...

  7. hdu 5301 Buildings (2015多校第二场第2题) 简单模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301 题意:给你一个n*m的矩形,可以分成n*m个1*1的小矩形,再给你一个坐标(x,y),表示黑格子 ...

  8. ASP.NET MVC HttpVerbs.Delete/Put Routes not firing

    原文地址: https://weblog.west-wind.com/posts/2015/Apr/09/ASPNET-MVC-HttpVerbsDeletePut-Routes-not-firing ...

  9. poj 1328 Radar Installation 排序贪心

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 56702   Accepted: 12 ...

  10. CareerCup之1.3字符串去重

    [题目] 原文: 1.3 Design an algorithm and write code to remove the duplicate characters in a string witho ...