Kinect for Windows SDK v2.0 开发笔记 (九)面部帧获取

转载于:https://blog.csdn.net/dustpg/article/details/38761681

使用SDK: Kinect for Windows SDK v2.0 public preview 1408


我是程序猿帝国前方记者某灰,接下来是对坑爹微软的跟踪报道!


微软于8月20日发布了SDK2.0 PR1408....但.自.己.我.不.知.道.

因为官网上面是这样的,截图作证:


上面写着七月15...我以为还没更新...但是点进去.....


。。。居然更新了..老大...更新一下网页会死么...(貌似频率是周更?)


好了,看看我们这次有了说明新的坑爹东西:

主要: 

手势有32位支持了

Fusion支持 与 例子

面部 例子


所以,这次我们需要看看面部帧的获取。


先需要包含Kinect.Face.h头文件与连接Kinect.Face.lib静态库,当然不连接静态库,

而是使用显式动态链接dll文件 但是...没必要....又不是LGPL授权...


面部帧获取在PR1407尝试过了,返回的是“路径未找到”,这次将会说明为什么(简单总结就是因为微软坑爹)

先看看面部帧有什么数据可以获取:

1. 面部外框: 一个整数矩形,表示面部的位置。不知道为什么是整型的,因为浮点用惯了?


2.面部特征点: 一个浮点坐标数组,目前有下面5种

[cpp]  view plain  copy
  1. enum _FacePointType  
  2.     {  
  3.         FacePointType_None  = -1,  
  4.         FacePointType_EyeLeft   = 0,  
  5.         FacePointType_EyeRight  = 1,  
  6.         FacePointType_Nose  = 2,  
  7.         FacePointType_MouthCornerLeft   = 3,  
  8.         FacePointType_MouthCornerRight  = 4,  
  9.         FacePointType_Count = ( FacePointType_MouthCornerRight + 1 )   
  10.     } ;  
再增加上嘴唇与下嘴唇也不错。


3.面部旋转四元数:  一个四维向量,什么是四元数,可以自行搜索一下,不在本篇文章范围内

这个四元数可以转换为转动角度:roll pitch yaw


具体转换方法可以见范例或者自行搜索


4.面部相关属性数值: 表示面部当前某些状态的一个枚举数组

枚举如下:

[cpp]  view plain  copy
  1. enum _DetectionResult  
  2.     {  
  3.         DetectionResult_Unknown = 0,  
  4.         DetectionResult_No  = 1,  
  5.         DetectionResult_Maybe   = 2,  
  6.         DetectionResult_Yes = 3  
  7.     } ;  
状态如下:

[cpp]  view plain  copy
  1. enum _FaceProperty  
  2.     {  
  3.         FaceProperty_Happy  = 0,  
  4.         FaceProperty_Engaged    = 1,  
  5.         FaceProperty_WearingGlasses = 2,  
  6.         FaceProperty_LeftEyeClosed  = 3,  
  7.         FaceProperty_RightEyeClosed = 4,  
  8.         FaceProperty_MouthOpen  = 5,  
  9.         FaceProperty_MouthMoved = 6,  
  10.         FaceProperty_LookingAway    = 7,  
  11.         FaceProperty_Count  = ( FaceProperty_LookingAway + 1 )   
  12.     } ;  

名称大多易懂...但是Engaged是啥?忙碌?你怎么看出来的?


使用函数CreateFaceFrameSource创建一个面部帧源,这里改函数了,而不是之前的方法。

参数1就是Kinect设备指针  不多说

参数2是跟踪ID 需要一个确切的id,id无效的话无法获取面部帧数据 可以动态修改 没的话设0即可

参数3是一个位状态数组

[cpp]  view plain  copy
  1. enum _FaceFrameFeatures  
  2.     {  
  3.         FaceFrameFeatures_None  = 0,  
  4.         FaceFrameFeatures_BoundingBoxInInfraredSpace    = 0x1,  
  5.         FaceFrameFeatures_PointsInInfraredSpace = 0x2,  
  6.         FaceFrameFeatures_BoundingBoxInColorSpace   = 0x4,  
  7.         FaceFrameFeatures_PointsInColorSpace    = 0x8,  
  8.         FaceFrameFeatures_RotationOrientation   = 0x10,  
  9.         FaceFrameFeatures_Happy = 0x20,  
  10.         FaceFrameFeatures_RightEyeClosed    = 0x40,  
  11.         FaceFrameFeatures_LeftEyeClosed = 0x80,  
  12.         FaceFrameFeatures_MouthOpen = 0x100,  
  13.         FaceFrameFeatures_MouthMoved    = 0x200,  
  14.         FaceFrameFeatures_LookingAway   = 0x400,  
  15.         FaceFrameFeatures_Glasses   = 0x800,  
  16.         FaceFrameFeatures_FaceEngagement    = 0x1000  
  17.     } ;  

除了感觉有点麻烦,还有就是麻烦

参数4是输出 也不多说


其余的跟之前的一样,可谓驾轻就熟,值得注意的是 用0作为跟踪id 初始化的话,需要再次修改

跟踪id才行,面部帧源提供了这个接口,所以不能直接释放掉,作为成员变量吧


驾轻就熟:

面部帧源创建面部帧读取器 

面部帧读取器 ->AcquireLatestFrame 获取最新一帧

或者使用事件模式,不过鉴于目前就已经支持6人了,还是轮询吧。


使用面部帧读取器需要检查是否在跟踪,是的话进入下一步,否的话尝试获取新的跟踪ID


跟踪ID是有骨骼帧(BodyFrame)相关接口获取的,方法接口是IBody::get_TrackingId

所以这里需要打开骨骼帧


在跟踪时,使用IFaceFrame::get_FaceFrameResult获取面部帧结果(IFaceFrameResult)


IFaceFrameResult提供的一系列接口用来获取前面提到的面部数据,详细的看头文件好了,

官网目前貌似还没有这个的API说明


这就差不多了,可以自行编码了。但是你会发现缺少dll文件...

你可以从XXX\v2.0-PublicPreview1408\Redist\Face\x86\找到这个dll文件,复制过来吧,64位就找x64


然后你就会发现你被坑了,CreateFaceFrameSource返回:路径未找到...


你还需要将同一目录下的NuiDatabase文件夹一起复制过去..............


好了,为方便,可以使用命令:

在项目属性-配置属性-生成事件-后期生成事件的命令行里面填写:

[plain]  view plain  copy
  1. xcopy "$(KINECTSDK20_DIR)Redist\Face\x86\NuiDatabase" "$(TargetDir)NuiDatabase" /e /y /i /r  
  2. xcopy "$(KINECTSDK20_DIR)Redist\Face\x86\Kinect20.Face.dll" "$(TargetDir)" /c /y  

即可,xcopy命令详细请搜索



使用结果:相当不稳定



数据抖动相当厉害....简直没法用....


还有我截图的时候面目狰狞....就不献丑了.我对这个看脸的世界绝望了


范例下载:点击这里


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值