欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

OpenCV 脸部跟踪(2)

程序员文章站 2023-12-26 21:10:27
...

【原文:http://www.cnblogs.com/mikewolf2002/p/3474188.html】 前面一篇文章中提到,我们在一副脸部图像上选取76个特征点来描述脸部形状特征,本文中我们会把这些特征点映射到一个标准形状模型。 通常,脸部形状特征点能够参数化分解为两个变量,一个是全

【原文:http://www.cnblogs.com/mikewolf2002/p/3474188.html】

前面一篇文章中提到,我们在一副脸部图像上选取76个特征点来描述脸部形状特征,本文中我们会把这些特征点映射到一个标准形状模型。

通常,脸部形状特征点能够参数化分解为两个变量,一个是全局的刚体变化,一个是局部的变形。全局的刚体变化主要是指脸部能够在图像中移动,旋转,缩放,局部的变形则是指脸部的表情变化,不同人脸的特征等等。

形状模型类主要成员如下:

class shape_model
{ //2d linear shape model
public:
Mat p; //parameter vector (kx1) CV_32F,参数向量
Mat V; //shape basis (2nxk) CV_32F, line subspace,线性子空间
Mat e; //parameter variance (kx1) CV_32F 参数方差
Mat C; //connectivity (cx2) CV_32S 连通性

//把一个点集投影到一个可信的脸部形状空间
void calc_params(const vector &pts, //points to compute parameters from
const Mat weight = Mat(), //weight of each point (nx1) CV_32F 点集的权重
const float c_factor = 3.0); //clamping factor

//该函数用人脸模型V和e,把向量p转化为点集
vector calc_shape(); //shape described by parameters @p

...

void train(const vector > &p, //N-example shapes
const vector &con = vector(), //point-connectivity
const float frac = 0.95, //fraction of variation to retain
const int kmax = 10); //maximum number of modes to retain
...

}

本文中,我们通过Procrustes analysis来处理特征点,移去全局刚性变化Procrustes analysis算法可以参考:http://en.wikipedia.org/wiki/Procrustes_analysis

在数学上,Procruster analysis就是寻找一个标准形状,然后把所有其它特征点数据都和标准形状对齐,对齐的时候采用最小平方距离,用迭代的方法不断逼近。下面通过代码来了解如何实现Procrustes analysis。

//Procrustes分析的基本思想是最小化所有形状到平均形状的距离和
Mat shape_model::procrustes(const Mat &X,
const int itol, //最大迭代次数
const float ftol //精度

)
{

X矩阵就是多副样本图像76个特征点组成的矩阵,共152行,列数为图像的个数,每列表示一个样本图像特征点的x,y坐标。
int N = X.cols,n = X.rows/2;

//remove centre of mass
//所有的形状向量(特征)对齐到原点,即每个向量的分量减去其平均值,每列是一个形状向量。

Mat P = X.clone();
for(int i = 0; i {
Mat p = P.col(i); //第i个向量
float mx = 0,my = 0;
for(int j = 0; j //x,y分别计算得到平均值。

{
mx += p.fl(2*j);
my += p.fl(2*j+1);
}
mx /= n; my /= n;
for(int j = 0; j {
p.fl(2*j) -= mx;
p.fl(2*j+1) -= my;
}
}

上一篇:

下一篇: