一名热爱体感技术的
业余专业开发人员

Kinect人脸跟踪Kinect Face Tracking SDK

相关资料免费积分下载链接

对应CSDN上本文的地址(有百来条评论,如有问题可以先去看看)

更新:

[2013-10-10]添加了三维人脸特征点获取的代码

[2013-4-10]编译程序时遇到xcopy问题(error MSB3073),猪猪猪小航给出了他的解决办法(第4节)。

[2013-3-25]程序源代码由kexin_0311进行了改进,避免了人脸走出检测后窗体假死情况(第6节)。

前言

自上篇Kinect SDK 1.5 Face Tracking文章出现后(2012-5-27),许多人阅读到了(CSDN,博客园,百度文库),相关代码也被上百次下载(百度文库、csdn)。已经过去很久了,但是国内依旧没有发现很好的关于这方面的博客(大家都藏着掖着吗)。当时我对于C++中的多线程还半知半解,如今多次使用有些熟悉。

之所以Kinect中的Face Tracking没有得到很多的关注,我想主要原因还是这个方法必须使用Kinect硬件(真不便宜啊,普通摄像头几十块ok了),只适合开发Kinect室内应用。其次这个Face Tracking也是很耗CPU的,一般的双核电脑一旦运行经常会占用90%多的CPU。题外话,微软有许多强大的算法,比如人脸跟踪(基于普通彩色摄像头),但是他们只给了Windows Phone下的API,却不给出PC下的。我也去天津参加过Kinect的会议,遇到一些微软的产品,确实做得很强大很稳健,人脸检测用改进的特征进行Adaboost,之后用AAM进行面部特征点跟踪,十分稳健。去年参加了不少面试,国内的很多公司都在做人脸识别,但真正有实力的只有大公司弄的好。但如果说你想靠这个Kinect的人脸识别混饭吃,有点困难,除非你研究AAM人脸跟踪算法再去研究人脸识别、表情识别、三维建模等算法才会有饭吃。

鉴于之前没有对Kinect的Face Tracking进行详细描述和探讨,直接暴力的给出相关代码,有必要给出更详细的文章和更好的代码。

————————————————————————————

人脸跟踪概念

首先现在大部分开发都针对Kinect for windows(目前1900RMB,还是有点贵的)了,但这个face tracking SDK在xbox版的Kinect依旧可以运行,自然精度会不好。Kinect for windows的深度数据是640*480的,而xbox的是320*240。而彩色的RGB摄像头也清晰不少,这点官方没有具体介绍,但实际效果好很多。如果要做研究,自然使用贵很多的Kinect for windows了(这样也导致了个人一般不会去玩这个传感器),不过对于学校、公司这点钱不多。下面默认使用Kinect for windows,但代码稍加修改在xbox的kinect上也能运作。

————————————————–

(1)软件硬件配置

Kinect for Windows有如下要求:

采用下列操作系统的一种:

Windows 7

嵌入式Windows 标准7

嵌入式WindowsPOSReady 7

Windows 8

 

硬件要求

32位(x86)或64位(x64) 处理器

双核2.66-GHz 或更快的处理器(建议使用i7)

专用USB 2.0总线

2 GB内存

 

从Kinect SDK 1.5开始的Kinect for windows开发工具包中含有人脸追踪模块,当前最新的是SDK1.6。在近几个星期里,将会有新的SDK会更新。新的SDK将会带来简单的动作识别(手握拳和张开)和Kinect Fusion三维实时建模。

————————————————–

(2)face tracking参数

依赖于你PC的CPU能力,人脸跟踪引擎使用4~8ms对一帧图像进行人脸跟踪,仅仅只依赖于CPU(没有使用GPU)。

将会影响跟踪准确率的因素:

A.光照:光线应该充足,没有太多阴影或者太强的侧光。也就是光照要均匀,并且足够。

B.距离:距离Kinect的距离,距离体感越近则跟踪效果越好,当小于1.5m时,跟踪的效果是最好的,因为越近深度数据越精确。当然也不能太近了,如果小于0.5m,深度数据都无法获取,或者人脸遮住摄像头了,也无法跟踪。

C.遮挡:戴厚眼镜或者Lincoln那样的胡子,人脸跟踪会有问题,这点还是需要改善的方面。

使用了Active Apperance Model作为二维特征跟踪器,然后我们把计算模型扩展到我们的Kinect深度数据上,然后它可以跟踪三维的人脸,这样使得它比二维特征点跟踪器稳健。AAM算法对于真实世界的情况不是很稳健。一些算法:算法AAMAAM人脸跟踪算法3.

————————————————–

(3)具体技术

坐标系统:

使用了Kinect的坐标系统来输出三维跟踪结果(x,y,z)。Z轴是传感器到用户的距离,Y轴是上下指向。数据都是以米为计量单位(这样一般会读出2.xxx,1.xxx之类的浮点数值),角度都是旋转角度(不是弧度)。

 

上图是输出的三维面具在kinect的坐标下情况。

 

输入图像:

彩色图像和深度图像。其实还需要一个人头和脖子的三维坐标。

————————————————–

(4)函数和结构

人脸追踪的SDK是免注册的COM对象。主要有4个COM接口

IFTFaceTracker:人脸追踪主要接口。

IFTResult:人脸追踪运算的结果。

IFTImage:图像缓冲区,类似OpenCV的Mat。

IFTModel:三维人脸模型

还有一些结构:

FT_SENSOR_DATA:包含用于人脸追踪所有所需的输入数据。

FT_CAMERA_CONFIG:包含彩色或者深度传感器的信息。

FT_VECTOR2D:二维向量。也就是(x,y),(x,y)…

FT_VECTOR3D:三维向量。

FT_TRIANGLE:三维模型人脸角度。

FT_WEIGHTED_RECT:权重矩阵。

————————————————–

(5)人脸跟踪简易流程

 

      不论是1个人的还是2个人的追踪,都差不多。一般追踪距离摄像头比较近的人,骨骼数据可能有时无法获取(那就使用上一帧的就是,经验之谈,因为很随机)。

———————————————————————————–

更多人脸跟踪细节介绍

这里介绍一些实际开发时遇到的问题。

(1)线程问题

一般至少2个线程,微软给的例子(FaceTrackingVisualization)一个是获取彩色、深度、骨骼的线程,另一个线程直接调用使用这三个数据,把数据传给人脸跟踪模块,都没进行线程同步。我有点疑问,不同步会不会有问题,但怎么运行测试都木有问题。每次跟踪后它都Sleep(16)一下,这个数值自己可以修改,我在win32应用里使用Sleep(30)运行结果不错,而在MFC中也使用Sleep(16)。

这里还需要特别说明的是,千万小心对于原始数据的操作,也就是彩色、深度数据的操作。如果你想显示数据,请拷贝数据后另行处理,不要直接在数据上进行处理,否则会出现很麻烦的问题。你以为把数据传给跟踪模块后,就可以直接在彩色数据(IFTImage)上进行更改了,但在你更改后,人脸跟踪模块由于设置的是16ms,马上又调用人脸跟踪,丢失了人脸模型!这样会出现一种结果:人脸跟踪十分不稳定,面具随机在人脸附近跳动,人脸一旦运动快点,跟踪会发生失效。所以之后我学乖了,要对数据处理或者显示,另外拷贝一份,其实拷贝图像数据是瞬间的事情。

(2)人脸特征点

微软在face tracking介绍给了一张的人脸图像,这里我就不给图像了,因为那张人脸特征点图像不论是位置还是下标都是不符的。这里我给出我得到的图像

 

上图有121个特征点(有些点重复,有些不存在)微软的面部特征点符合Candide-3标准,我们可以在文献(Candide-3_-_an_updated_parameterised_face)中阅读到一张表Appendix A: The CANDIDE -3Vertices and the Corresponding MPEG -4 Facial Feature Points。它列出了113个顶点(下标从0开始),这些顶点的定义和程序中获取的数组一一对应,还多出来的部分可以无视掉。

这张图像是使用OpenCV显示人脸跟踪数组中的顶点结果,我们可以自己修改程序画出来,需要注意的就是把图像画大一些,否则字符串会重叠在一起。之所以我用线连起来,主要为了看上去更方便,如果一百多个数字显示在图片上,肯定没人想去研究。我把数字按顺序一次连接,发现某些点可以连接出如图所示的线段图。至于每个点到底什么意思,还是要对照表中定义。

显然这么多点,我们只取需要的点即可。这个仁者见仁智者见智吧。

下图是顶点定义的那张表:

 

 

(3)人脸旋转

获取人脸跟踪结果后,我们除了得到面部关键顶点还可以直接获取人脸朝向(Get3DPose函数)。下图是人脸朝向的定义:

 

Angle

Value

Pitch angle

0=neutral

-90 = looking down towards the floor

+90 = looking up towards the ceiling

Face Tracking tracks when the user’s head pitch is less than 20 degrees, but works best when less than 10 degrees.

Roll angle

0 = neutral

-90 = horizontal parallel with right shoulder of subject

+90 = horizontal parallel with left shoulder of the subject

Face Tracking tracks when the user’s head roll is less than 90 degrees, but works best when less than 45 degrees.

Yaw angle

0 = neutral

-90 = turned towards the right shoulder of the subject

+90 = turned towards the left shoulder of the subject

Face Tracking tracks when the user’s head yaw is less than 45 degrees, but works best when less than 30 degrees

自然如果你做简单的人头旋转头部动作识别,肯定得用到这块。如果你做人脸标表情、动作或者三维建模,也少不了使用这个旋转角度对人脸进行一些仿射变换。很显然,Roll方向上的人脸旋转可以消除掉(我在我的人脸识别中就这样)。如果你使用OpenCV进行放射旋转,要熟悉矩阵旋转公式,一旦人脸旋转,那么所有的顶点坐标都要跟着旋转,如果扣除人脸区域,那么相应的人脸顶点坐标也要减去x轴和y轴的数值。还有需要考虑一些临界情况,比如人脸从左侧移除,人脸从上方、下方走出,会不会导致程序崩溃?此时的人脸数据不可以使用。

之后还有动画单元等概念,也是可以通过函数直接获取结果,这部分我未进行研究,如果做表情或者人脸动画,则需要深入研究下。

———————————————————————————-

程序配置与说明

对于Win32程序。如果只想看效果,不想研究代码,安装好Kinect驱动后,可以直接点击Debug下的exe应用程序进行运行即可。如果想研究代码,需要配置OpenCV环境(文章链接),随便你使用OpenCV2.x某个版本,建议使用目前最新的OpenCV2.4.4。之所以使用OpenCV,是因为用它显示视频会十分简单,用到的代码也不多。

 

[2013-4-10]配置方法和解决xcopy方法由猪猪猪小航提供。

 

4.1配制方法

 

首先按照自己电脑上opencv的库文件地址、包含目录地址、库文件,将它们添加到相应的配置属性中

下方的OpenCV244opencv,,,,,配置在上方可添加路径区域效果是一样的,即:

 

包含目录配置:

或者

 

4.2编译程序遇到xcopy问题

 

如果在编译运行的时候,遇见关于“xcopy”的问题

 

在配置属性中生成事件->后期生成事件中删除命令行的内容就可以了

———————————————————————————–

参考网站和资源:

博客:

[shi19871987]Kinect for windows SDK1.5人脸识别与跟踪

http://blog.csdn.net/shi19871987/article/details/7748094

 

[yangecnu, 杨洋]Kinect for Windows SDK开发入门(十六)面部追踪上【C#】

http://www.cnblogs.com/yangecnu/archive/2012/10/12/KinectSDK_FaceTracking.html

 

[箫鸣] Kinect SDK 1.5 Face Tracking —> 使用opencv显示后的超级简化版本

http://blog.csdn.net/guoming0000/article/details/7607473

http://wenku.baidu.com/view/cf533d6858fafab069dc0256.html

 

一些官方资源:

Kinect官网

http://www.microsoft.com/zh-cn/kinectforwindows/

 

How To Use Kinect Face Tracking SDK

http://www.codeproject.com/Articles/394975/How-To-Use-Kinect-Face-Tracking-SDK

 

Candide标准

http://www.bk.isy.liu.se/candide/main.html

 

Face Tracking

http://msdn.microsoft.com/en-us/library/jj130970.aspx

【需要翻墙】

http://nsmoly.wordpress.com/2012/05/21/face-tracking-sdk-in-kinect-for-windows-1-5/

 

最后如果有任何问题,或者想一起讨论最好去我的CSDN留言,因为留言会自动发送到我的邮箱里面。也可以私信我的新浪微博。还有文章应该会不断更新,在我的网站(ilovecode.cn)上对应标题的文章会进行持续更新。欢迎大家分享相关知识,上篇kinect人脸跟踪文章写出后快一年了,中国这么大也未有人与我讨论。

———————————————————————————–

程序源代码

[2013-3-25]程序由kexin_0311进行了改进,避免了人脸走出检测后窗体假死情况。

[2013-3-27]修正了对face tracking窗口按下ESC不响应的问题(逻辑问题),去除了cout显示的参数。

 

获取人脸特征点三维坐标(2013-10-10)

 

 

 

评论 11

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #7

    你好,获取人脸特征点三维坐标中的 context 是如何定义的呢?谢谢!

    风尘如霜的容颜3年前 (2015-12-28)回复
  2. #6

    谢谢!

    中秋月饼3年前 (2015-12-22)回复
  3. #5

    不好意思,很久不弄了,能提供的都提供了

    小明4年前 (2015-03-20)回复
  4. #4

    能否详细说明下怎样获得人脸特征点三维坐标的呢?

    能否详细说明下怎样获得人脸特征点三维坐标的呢?4年前 (2015-03-17)回复
    • 不好意思,已经无法更详细了,早就不弄这个了~

      小明4年前 (2015-03-19)回复
  5. #3

    是吗~那定义呢?求他这里的2d特征点定义在哪里啊~我给出的特征点2d和3d的都有吧

    小明4年前 (2014-11-24)回复
    • 他给的图就是定义了。他画的是根据图像数据得到的脸部轮廓特征点,是IFTResult::Get2DShapePoints( FT_VECTOR2D **ppPoints, UINT *pPointCount )方法中的得到的ppPoints值。你给的是通过计算得到的3D模型(the Candide3 model)的特征点。

      honmue4年前 (2014-11-25)回复
  6. #2

    有这么个教程很不错。微软给出的特征点是基于2D图像的,并不是不符。你给的是基于3D图像的特征点。

    honmue4年前 (2014-11-24)回复
  7. #1

    Hi, 你好,参考你的方法,我自己实现了一下 tracking,当 depth image dimension 240*320 时,tracking 比较流畅准确,但是当变成 480*640 时,tracking 结果很差,经常tracking不到,或者tracking的mask偏差非常大,但是 sdk中的 FaceTrackingVisualization 中采用的是 480*640, 其运行完全没有问题,想问下如何解决这个问题,多谢~

    charder5年前 (2013-11-12)回复
    • 这个是半年多前的程序了,也许是你FT_CAMERA_CONFIG myCameraConfig等参数配置的错误吧。既然微软的可以很好的运行,你就要好好看他们的程序啊~你试试我这个程序能不能运行在480X640呢~

      箫鸣5年前 (2013-11-12)回复