Kinect for Windows SDK v2.0 开发笔记 (九)面部帧获取_kinect2 面部特征点 分布_dustpg的博客-程序员秘密

技术标签: Kinect  C++  Kinect for Windows SDK v2.0 开发笔记  开发笔记  

(转载请注明出处)

使用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种

enum _FacePointType
    {
        FacePointType_None	= -1,
        FacePointType_EyeLeft	= 0,
        FacePointType_EyeRight	= 1,
        FacePointType_Nose	= 2,
        FacePointType_MouthCornerLeft	= 3,
        FacePointType_MouthCornerRight	= 4,
        FacePointType_Count	= ( FacePointType_MouthCornerRight + 1 ) 
    } ;
再增加上嘴唇与下嘴唇也不错。


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

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


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


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

枚举如下:

enum _DetectionResult
    {
        DetectionResult_Unknown	= 0,
        DetectionResult_No	= 1,
        DetectionResult_Maybe	= 2,
        DetectionResult_Yes	= 3
    } ;
状态如下:

enum _FaceProperty
    {
        FaceProperty_Happy	= 0,
        FaceProperty_Engaged	= 1,
        FaceProperty_WearingGlasses	= 2,
        FaceProperty_LeftEyeClosed	= 3,
        FaceProperty_RightEyeClosed	= 4,
        FaceProperty_MouthOpen	= 5,
        FaceProperty_MouthMoved	= 6,
        FaceProperty_LookingAway	= 7,
        FaceProperty_Count	= ( FaceProperty_LookingAway + 1 ) 
    } ;

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


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

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

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

参数3是一个位状态数组

enum _FaceFrameFeatures
    {
        FaceFrameFeatures_None	= 0,
        FaceFrameFeatures_BoundingBoxInInfraredSpace	= 0x1,
        FaceFrameFeatures_PointsInInfraredSpace	= 0x2,
        FaceFrameFeatures_BoundingBoxInColorSpace	= 0x4,
        FaceFrameFeatures_PointsInColorSpace	= 0x8,
        FaceFrameFeatures_RotationOrientation	= 0x10,
        FaceFrameFeatures_Happy	= 0x20,
        FaceFrameFeatures_RightEyeClosed	= 0x40,
        FaceFrameFeatures_LeftEyeClosed	= 0x80,
        FaceFrameFeatures_MouthOpen	= 0x100,
        FaceFrameFeatures_MouthMoved	= 0x200,
        FaceFrameFeatures_LookingAway	= 0x400,
        FaceFrameFeatures_Glasses	= 0x800,
        FaceFrameFeatures_FaceEngagement	= 0x1000
    } ;

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

参数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文件夹一起复制过去..............


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

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

xcopy "$(KINECTSDK20_DIR)Redist\Face\x86\NuiDatabase" "$(TargetDir)NuiDatabase" /e /y /i /r
xcopy "$(KINECTSDK20_DIR)Redist\Face\x86\Kinect20.Face.dll" "$(TargetDir)" /c /y

即可,xcopy命令详细请搜索



使用结果:相当不稳定



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


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


范例下载:点击这里


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dustpg/article/details/38761681

智能推荐

Android studio 4.0 Layout Inspector查看当前Activity_legacy layout inspector_郭梧悠的博客-程序员秘密

在使用Android studio的时候博主很喜欢使用Layout Inspector功能来查看当前的Activity。这样对于熟悉新项目来说特别有用。但是升级了4.0版本之后发现每次点击Layout Inpsector都是直接显示布局结构了,并没有熟悉的Activity选择框,然后博主一番寻找找到了解决方式:点此查看。修改之前:Tools–>Layout Inspector修改方法:File > Settings > Experimental 把 Enable Live Layout

一段程序的人生 第12章:萧何_傻看天的博客-程序员秘密

从第0章开始阅读第拾贰章 萧何    通过网络嗅探,我终于拿到了服务器上论坛的admin用户的密码,并且用它登录进入了论坛的后台系统。进入之后,看到了很多的管理功能,比如用户的禁用、改密码、设置版主、调整板块等等,这些对我几乎没有什么用,直到我看到有个“系统管理”的功能之后,燃起了我无法浇灭的希望。系统管理里有很多有意思的东西,比如设置自动备份恢复数据、设置论坛的访问规则等

python中正则表达式来验证QQ号,手机号,邮箱号,身份证号_梧桐online的博客-程序员秘密

'''QQ的特征: 1.最少5位,最长11位 2.5位的是10001起始 3.一般以QQ:/qq:开始'''#先导入re模块import redef checkQQ(str): # 正则表达式 pattern = r"qq:[1-9]\d{4,10}" res = re.findall(pattern,str,re.I) retu...

自学Webpack_不知如何的博客-程序员秘密

const { resolve } = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = { entry: './src/index.js', output: { filename: 'built.js', path: resolve(__dirname, 'build') }, module: { rules: [ {

win7下安装mongoDB数据库_weixin_34279246的博客-程序员秘密

为什么80%的码农都做不了架构师?>>> ...

随便推点

antlr相关问题_kong-kong的博客-程序员秘密

Can’t load Hello as lexer or parser在CLASSPATHZ最前面加上.;.;C:\develop\antlr\antlr-4.8-complete.jar

linux系统下修改root账户密码,报错‘authentication token manipulation error ‘问题解决_单用户 authentication token manipulation error_ZhaoHuaQiaoMagic的博客-程序员秘密

linux系统下修改root账户密码,报错’authentication token manipulation error '问题解决在这里例出网上提到的解决方案: 1)可能是/etc/passwd和/etc/shadow文件不同步导致的,使用pwconv命令同步; 2)/etc/passwd和/etc/shadow设置了安全设置,通过chattr -i /etc/passwd /etc/shadow解决; 3)通过echo "123456" | passwd --stdin root或echo "

Ext gridPanel 导出到Excel_zoujp_xyz的博客-程序员秘密

<br />gridToExcel.js<br />/** * allows for downloading of grid data (store) directly into excel * Method: extracts data of gridPanel store, uses columnModel to construct XML excel document, * converts to Base64, then loads everything into a data URL

管道和xargs命令_windows10 xargs_lvwinter的博客-程序员秘密

管道和xargs命令1,stdin,stdout,stderr对于新生成的任何进程来讲,都可以使用stdin,stdout,stderr这些文件指针来访问标准输入,标准输出,错误文件。他们的类型都是FILE *,属于c运行库的类型。而内核则使用文件描述符来代表文件。STD

推荐文章

热门文章

相关标签