本文中的知识来自于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. ecshop,大商创后台支付系统修改模板

    初始模板 要求修改 增加了多个账户可供用户进行选择 解决方法 一找到要修改模板路径:即:http://dsctest.cn/admin/payment.php?act=edit&code=ba ...

  2. 接口调用 POST

    /** * 接口调用 POST * @return [type] [description] */ public function portPhone(Request $request) { $pho ...

  3. react篇章-React Props

    state 和 props 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变.这就是为什么有些容器组件需要定义 state 来更新和修改数据. 而子组件只能通过 pro ...

  4. sublime text3安装Package Control和Vue Syntax Highlight

    一.下载Sublime3 https://www.sublimetext.com/3 二.安装Package Control 在线安装: https://packagecontrol.io/insta ...

  5. PreEssentials与MFC集成使用

    ProEssentials是Gigasoft公司开发的一个功能十分强大的分发免费的工控图表.它提供了几乎所有的曲线显示形式,支持多种开发工具,提供以下接口供开发者调用:.NET(WinForm).AS ...

  6. DHTML参考手册

    中文DHTML参考手册 本dhtml教程由宏博内容管理系统为它的Smarty模板制作者收集的,目的是可以做出更加精美的模板.下面列出了由动态 HTML 定义的对象.DHTML中文参考手册,实用dhtm ...

  7. Android中利用ant进行多渠道循环批量打包

    公司负责Android开发的小伙伴学习能力稍微偏弱,交代给他的自动化打包的任务,弄了好久依然没有成效.无奈只好亲自出手. 没有想到过程很顺利,我完全按照如下文章的步骤进行: 主要参考: Android ...

  8. mutiplemap 总结

    之前只是在C++ Primer里面看过关联容器,可能因为没有实际用过,只是看看,所以导致用的时候并不熟悉: 在这之前,map和set的特性应该要了解,map是关联数组,也就是由键值对组成的,而set只 ...

  9. Codeforces Round #222 (Div. 1) B. Preparing for the Contest 二分+线段树

    B. Preparing for the Contest 题目连接: http://codeforces.com/contest/377/problem/B Description Soon ther ...

  10. SQL Server Management Studio 教程一:设置sa用户登录

    今天在net项目中添加数据库过程中出现了小问题,就是使用sql server身份验证没登录成功,经过一番调试,终于解决问题. 使用sa账户登录sql server 2008 的方法步骤如下: 1.首先 ...