本文中的知识来自于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. thinkphp _complex 复合查询 where多个子组实现

    SELECT * FROM `user` WHERE ( `mobile` = '13824653465' OR `nickname` = 'evan' OR `openid` = '14545-fd ...

  2. 002 python语法入门

    一:基本数据类型知识点 1.基本数据类型 Number 数字 String 字符串 Bool 布尔 List 列表 Tuple 元组 Set 集合 Dictionary字典 2.分类 )标准的pyth ...

  3. 深度学习---手写字体识别程序分析(python)

    我想大部分程序员的第一个程序应该都是“hello world”,在深度学习领域,这个“hello world”程序就是手写字体识别程序. 这次我们详细的分析下手写字体识别程序,从而可以对深度学习建立一 ...

  4. CSUOJ 1162 Balls in the Boxes 快速幂

    Description Mr. Mindless has many balls and many boxes,he wants to put all the balls into some of th ...

  5. python 与 mongodb的交互---查找

    python与mongo数据库交互时,在查找的时候注意的一些小问题: 代码: from pymongo import * def find_func(): #创建连接对象 client = Mongo ...

  6. python使用web.py开发httpserver,解决post请求跨域问题

    使用web.py做http server开发时,遇到postman能够正常请求到数据,但是浏览器无法请求到数据,查原因之后发现是跨域请求的问题. 跨域请求,就是在浏览器窗口中,和某个服务端通过某个 “ ...

  7. 机器学习之路: python 支持向量机 LinearSVC 手写字体识别

    使用python3 学习sklearn中支持向量机api的使用 可以来到我的git下载源代码:https://github.com/linyi0604/MachineLearning # 导入手写字体 ...

  8. Linux驱动之PCI

    <背景> PCI设备有许多地址配置的寄存器,初始化时这寄存器来配置设备的总线地址,配置好后CPU就可以访问该设备的各项资源了.(提炼:配置总线地址)   <配置寄存器>   ( ...

  9. [BZOJ5291][BJOI2018]链上二次求和(线段树)

    感觉自己做的麻烦了,但常数似乎不算差.(只是Luogu最慢的点不到2s本地要跑10+s) 感觉我的想法是最自然的,但不明白为什么网上似乎找不到这种做法.(不过当然所有的做法都是分类大讨论,而我的方法手 ...

  10. [SPOJ-LCS]Longest Common Substring

    题目大意: 求两个字符串的LCS. 思路: 对其中一个字符串构建SAM,然后用另一个字符串在里面匹配,按照SAM的边一直往下走,匹配到的连续的字符数就是公共字串的长度. #include<str ...