OpenCV 脸部跟踪(1)
本文中的知识来自于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)的更多相关文章
- OpenCV 脸部跟踪(2)
前面一篇文章中提到,我们在一副脸部图像上选取76个特征点,以及这些特征点的连通性信息来描述脸部形状特征,本文中我们会把这些特征点映射到一个标准形状模型. 通常,脸部形状特征点能 ...
- OpenCV 脸部跟踪(3)
前面一篇文章我们生成了脸部特征的线性形状模型,本章来学习一下显示线性形状的代码. 线性模型类的结构如下: class shape_model { ...
- python + opencv: kalman 跟踪
之前博文中讲解过kalman滤波的原理和应用,这里用一个跟踪鼠标的例程来演示怎么在opencv里用自带的kalman函数进行目标跟踪,文章的内容对做图像跟踪有借鉴意义.文章主要是网络资源进行整理和简单 ...
- Opencv目标跟踪—CamShift算法
CamShift算法全称是"Continuously Adaptive Mean-Shift"(连续的自适应MeanShift算法),是对MeanShift算法的改进算法,可以在跟 ...
- Opencv人头跟踪检测
//-------------------------------------人头检测------------------------------------- int main(){ //V ...
- opencv视频跟踪2
在前面的报告中我们实现了用SURF算法计算目标在移动摄像机拍摄到的视频中的位置.由于摄像机本身像素的限制,加之算法处理时间会随着图像质量的提高而提高,实际实验发现在背景复杂的情况下,结果偏差可能会很大 ...
- OpenCV人脸特效制作
https://blog.csdn.net/zxc024000/article/details/50456917 https://blog.csdn.net/huanghuangjin/article ...
- OpenCV面、人眼检测
/* 功能:实现对眼睛.脸部的跟踪. 版本号:1.0 时间:2014-4-27 */ #include <opencv2/objdetect/objdetect.hpp> #include ...
- OpenCv 人脸检測的学习
近期公司要组织开发分享,可是自己还是新手真的不知道分享啥了,然后看了看前段时间研究过OpenCv,那么就分享他把. openCv就不介绍了,说下人脸检測.事实上是通过openCv里边已经训练好的xml ...
随机推荐
- Windows下安装mysql cluster
0.mysql集群介绍 浅谈mysql集群——http://blog.csdn.net/chenxingzhen001/article/details/7708663: 官网——http://dev. ...
- Block的基本用法
NSString* (^myBlock)(NSString*, int); myBlock = ^(NSString *name, int age){ return [NSString stringW ...
- 决策树算法(Bagging与随机森林)
Bagging算法: 将训练数据集进行N次Bootstrap采样得到N个训练数据子集,对每个子集使用相同的算法分别建立决策树,最终的分类(或回归)结果是N个决策树的结果的多数投票(或平均). 其中,B ...
- bzoj1211: [HNOI2004]树的计数 prufer编码
题目链接 bzoj1211: [HNOI2004]树的计数 题解 prufer序 可重排列计数 代码 #include<bits/stdc++.h> using namespace std ...
- 优客365 v2.9版本 后台存在SQL注入
安装 打开后台登陆界面 http://localhost:9096/yk365/system/login.php 输入单引号报错 得到表名 经过跟踪后在\module\login.php文件出现错误 ...
- [COGS2580]偏序 II
[COGS2580]偏序 II 题目大意: \(n(n\le50000)\)个五元组,求五维偏序. 思路: CDQ分治套CDQ分治套CDQ分治套树状数组. 时间复杂度\(\mathcal O(n\lo ...
- hdu 5301 Buildings (2015多校第二场第2题) 简单模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301 题意:给你一个n*m的矩形,可以分成n*m个1*1的小矩形,再给你一个坐标(x,y),表示黑格子 ...
- ASP.NET MVC HttpVerbs.Delete/Put Routes not firing
原文地址: https://weblog.west-wind.com/posts/2015/Apr/09/ASPNET-MVC-HttpVerbsDeletePut-Routes-not-firing ...
- poj 1328 Radar Installation 排序贪心
Radar Installation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 56702 Accepted: 12 ...
- CareerCup之1.3字符串去重
[题目] 原文: 1.3 Design an algorithm and write code to remove the duplicate characters in a string witho ...