OpenCV 脸部跟踪(3)

   前面一篇文章我们生成了脸部特征的线性形状模型,本章来学习一下显示线性形状的代码。

线性模型类的结构如下:

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 连通性

...

}

我们生成的线性形状模型用矩阵V表示,它是152*18,前四列是旋转缩放矩阵R,接着是保留的14副特征图像。

通过下面的代码计算平移和缩放:

float scale = calc_scale(smodel.V.col(0),200);
float tranx = n*150.0/smodel.V.col(2).dot(Mat::ones(2*n,1,CV_32F));
float trany = n*150.0/smodel.V.col(3).dot(Mat::ones(2*n,1,CV_32F));

参数p的计算如下,最后通过draw_shape函数求得生成的模型,并显示出来:

for(int k = 4; k < smodel.V.cols; k++)
{
    for(int j = 0; j < int(val.size()); j++)
    {
        Mat p = Mat::zeros(smodel.V.cols,1,CV_32F);
        p.at<float>(0) = scale;
        p.at<float>(2) = tranx;
        p.at<float>(3) = trany;
        p.at<float>(k) = scale*val[j]*3.0*sqrt(smodel.e.at<float>(k));
        p.copyTo(smodel.p);
        img = Scalar::all(255);
        char str[256];
        sprintf(str,"mode: %d, val: %f sd",k-3,val[j]/3.0);
        draw_string(img,str);
        vector<Point2f> q = smodel.calc_shape();
        draw_shape(img,q,smodel.C); //s = V*p
        imshow("shape model",img);
        if(waitKey(10) == 'q')
            return 0;
    }
}

显示结果如下图:

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

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

OpenCV 脸部跟踪(1)

    本文中的知识来自于Mastering  opencv with practical computer vision project一书.     本文实施的脸部跟踪算法都是基于数据驱动的,主要包括两个部分,训练和测试.训练就是通过脸部标记点的采样数据,训练得到一个标准的脸部模型,而测试部分就是把检测到的脸部和标准脸部模型比较,求得眼睛,鼻子等脸部特征.具体来讲,脸部跟踪分为三个部分:shape model形状模型,就是训练数据表示为什么样的形状模型:feature detector特征检

OpenCV 脸部跟踪(2)

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

对象跟踪小白?本文带你玩转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),业余时间较少分几次写完吧.      首先谈谈什么是非刚性人脸跟踪.它是对每帧视频图像中人脸特征稠密数据集合的估计.非刚性人脸跟踪侧重于不同脸部表情或不同人物的脸部特征相对距离的变化.它和一般的人脸检测与跟踪算法不同,它不仅仅是找到每一帧中人脸的位置,它还要找到人脸五官的组态关系.[可以作用表情识别]