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文件的目录。

时间: 2024-09-29 09:56:02

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

OpenCV 脸部跟踪(2)

      前面一篇文章中提到,我们在一副脸部图像上选取76个特征点,以及这些特征点的连通性信息来描述脸部形状特征,本文中我们会把这些特征点映射到一个标准形状模型.       通常,脸部形状特征点能够参数化分解为两个变量,一个是全局的刚体变化,一个是局部的变形.全局的刚体变化主要是指脸部能够在图像中移动,旋转,缩放,局部的变形则是指脸部的表情变化,不同人脸的特征等等.   下面我们通过train函数,一步步了解下如何把标记点特征数据转化为标准形状模型: 本文参考了下面两篇文章: http://

OpenCV 脸部跟踪(3)

   前面一篇文章我们生成了脸部特征的线性形状模型,本章来学习一下显示线性形状的代码. 线性模型类的结构如下: class shape_model     {                         //2d linear shape model     public:         Mat p;                                   //parameter vector (kx1) CV_32F,参数向量         Mat V;          

对象跟踪小白?本文带你玩转OpenCV(C ++ / Python)

作者介绍:Satya Mallick,擅长领域为计算机视觉,机器学习,人工智能. Linkdin:https://www.linkedin.com/in/satyamallick/zh-cn 在本教程中,我们将了解OpenCV 3.0中引入的OpenCV跟踪API. 我们将学习如何以及何时使用OpenCV 3.2中提供的6种不同的跟踪器- BOOSTING,MIL,KCF,TLD,MEDIANFLOW和GOTURN. 我们还将学习现代跟踪算法背后的基本理论. 什么是对象跟踪? 简单地说,在视频的

OpenCv 人脸检测的学习

最近公司要组织开发分享,但是自己还是新手真的不知道分享啥了,然后看了看前段时间研究过OpenCv,那么就分享他把. openCv就不介绍了,说下人脸检测,其实是通过openCv里边已经训练好的xml文件来进行的,我只是在学习. 我测试中我写了俩个Demo,其中一个是通过Carame来通过摄像头来进行人脸检测看看效果图: 可以看出检测出来的面部有线框. 第一个Dmeo是通过Jni编程来实现的人脸检测, (1)这是本地方法 package com.example.opencv.checkface2;

使用JavaScript 实现的人脸检测_javascript技巧

我一直对视频和图片中的人脸标记.检测和人脸识别技术很感兴趣.尽管我知道获取逻辑和算法去开发人脸识别软件或者插件已经超出了我的想象.当我知道Javascript库可以识别微笑,眼睛和脸部结构时,我得到启发去写一个教程.有许多的库,这些库要不就是纯粹的基于Javascript的,要不就是基于java语言的. 今天,我们开始学习tracking.js,它是一个由Eduardo Lundgren开发的轻量级的javascript库,它可以让你做实时的人脸检测,色彩追踪和标记好友的脸.在这个教程中,我们将

离散随机线性系统的卡尔曼滤波器基本原理及实现

     今天介绍Kalman滤波器理论知识,并给出一个演示的例子.由于Kalman滤波在目标跟踪时,需要不断获取观测向量,所以没法单独使用.如果时间充裕,下一篇博文将会做基于MeanShift + Kalman的目标跟踪.这次的主要结构: 1.       卡尔曼滤波器基本原理 2.       卡尔曼滤波器算法 3.       演示例子[来自课本:C语言常用算法程序集(第二版)]+网上广为流传的自由落体小球跟踪matlab   一.离散随机线性系统的卡尔曼滤波器基本原理     卡尔曼滤波

罗技摄像头在Windws Server 2008不能使用的解决方法

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   今日装好了server 2008 x86 企业版,虽然还未激活,但已经开始一股脑装各类驱动和软件了,最后在罗技快看 zoom摄像头的时候发现新版的罗技驱动 11.x for vista 等根本不识别硬件,老是未知设备. 电询罗技,得回复该产品不支持vista ,2008.异常郁闷,这个摄像头好好的,而且自带麦克风,脸部跟踪,不能用就太可惜了. 解决办法如下: 1

没听说过MSQRD?这可是Facebook刚收购用来对抗Snapchat的利器

三月初,Facebook宣布收购了一款鲜为人知的app---Masquerade (MSQRD). 马克·扎克伯格近日在Facebook上发布了一个自拍视频,视频中他使用了一个一个照片视频滤镜新产品,用户能用它给自拍加上面具贴图.在视频中,扎克伯格变成了炫酷的钢铁侠.看了扎克伯格的视频之后,Masquerade这家小公司沉浸在了狂喜之中. Masquerade投资人Nikolay Davidov表示:"我们没有料到我们的产品会如此受欢迎.扎克伯格使用它的方式太酷了,大家都很激动呢."

《Master Opencv...读书笔记》非刚性人脸跟踪 I

      最近又开始学习<MasteringOpenCV系列>之前没看的部分,依旧是英文版.这次主要研究"非刚性人脸跟踪"(non-rigid face tracking),业余时间较少分几次写完吧.      首先谈谈什么是非刚性人脸跟踪.它是对每帧视频图像中人脸特征稠密数据集合的估计.非刚性人脸跟踪侧重于不同脸部表情或不同人物的脸部特征相对距离的变化.它和一般的人脸检测与跟踪算法不同,它不仅仅是找到每一帧中人脸的位置,它还要找到人脸五官的组态关系.[可以作用表情识别]