Kinect v2.0原理介绍之十三:面部帧获取
2015-12-30 13:45
591 查看
使用SDK: Kinect for Windows SDK v2.0 public preview 1408
我是程序猿帝国前方记者某灰,
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/11/4056802bf4a2855f3bb7a999b2cc55aa)
接下来是对坑爹微软的跟踪报道!
微软于8月20日发布了SDK2.0 PR1408....但.自.己.我.不.知.道.
因为官网上面是这样的,截图作证:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/11/824b7f7d15f619fee4b42800cefa92b0)
上面写着七月15...我以为还没更新...但是点进去.....
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/11/8f25b0310400a165b0846b9033ec5f31)
。。。居然更新了..老大...更新一下网页会死么...(貌似频率是周更?)
好了,看看我们这次有了说明新的坑爹东西:
主要:
手势有32位支持了
Fusion支持 与 例子
面部 例子
所以,这次我们需要看看面部帧的获取。
先需要包含Kinect.Face.h头文件与连接Kinect.Face.lib静态库,当然不连接静态库,
而是使用显式动态链接dll文件 但是...没必要....又不是LGPL授权...
面部帧获取在PR1407尝试过了,返回的是“路径未找到”,这次将会说明为什么(简单总结就是因为微软坑爹)
先看看面部帧有什么数据可以获取:
1. 面部外框: 一个整数矩形,表示面部的位置。不知道为什么是整型的,因为浮点用惯了?
2.面部特征点: 一个浮点坐标数组,目前有下面5种
3.面部旋转四元数: 一个四维向量,什么是四元数,可以自行搜索一下,不在本篇文章范围内
这个四元数可以转换为转动角度:roll pitch yaw
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/11/22da9ba927d4537af41686cbca5324ee)
具体转换方法可以见范例或者自行搜索
4.面部相关属性数值: 表示面部当前某些状态的一个枚举数组
枚举如下:
名称大多易懂...但是Engaged是啥?忙碌?你怎么看出来的?
使用函数CreateFaceFrameSource创建一个面部帧源,这里改函数了,而不是之前的方法。
参数1就是Kinect设备指针 不多说
参数2是跟踪ID 需要一个确切的id,id无效的话无法获取面部帧数据 可以动态修改 没的话设0即可
参数3是一个位状态数组
除了感觉有点麻烦,还有就是麻烦
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/11/f1bd232d29470ddeab2bc2456be46b09)
参数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命令详细请搜索
使用结果:相当不稳定
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/11/718ae92113875aafa104c17410de3dba)
数据抖动相当厉害....简直没法用....
还有我截图的时候面目狰狞....就不献丑了.我对这个看脸的世界绝望了
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/11/f1bd232d29470ddeab2bc2456be46b09)
范例下载:点击这里
我是程序猿帝国前方记者某灰,
接下来是对坑爹微软的跟踪报道!
微软于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命令详细请搜索
使用结果:相当不稳定
数据抖动相当厉害....简直没法用....
还有我截图的时候面目狰狞....就不献丑了.我对这个看脸的世界绝望了
范例下载:点击这里
相关文章推荐
- 批处理中Copy与Xcopy命令的区别小结
- bat+xcopy实现只复制比目标文件更新的文件
- 利用xcopy命令实现本地文件复制到远程服务器的方法
- 谈谈xcopy中的排除copy
- xcopy 实现批处理拷贝文件或文件夹
- XCOPY只拷贝当天文件的实现代码
- XCOPY的高级使用:指定日期并且用EXCLUDE排除指定文件
- Xcopy 复制文件和目录,包括子目录。
- python实现linux下使用xcopy的方法
- XCOPY (一)
- andriod sdk 闪退问题
- 用FAAST把Kinect v2当作windows的键盘使用
- xcopy中提示“无效的参数数量”的解决方法
- xcopy中提示“无效的参数数量”的解决方法
- Xcopy结合脚本,实现文件服务器自动备份
- 本机自动备份到远程服务器
- XCOPY 的运用
- 浅谈NTFS权限迁移与共享权限迁移(上)
- xcopy
- 使用Xcopy 复制网络共享文件到本地磁盘