Kinect for Windows SDK v2.0 开发笔记 (十三) 高清面部帧(4) 面部模型构建器
(转载请注明出处)
使用SDK: Kinect for Windows SDK v2.0 public preview1409
同前面,因为SDK未完成,不附上函数/方法/接口的超链接。
这次让我们让面部捕捉更加稳定/精确吧!
自从一直8月有了高清面部帧的例子后,觉得IFaceModel::GetFaceShapeDeformations它不干正事,一直返回0.0f的数据。
与其他开发者简单交流后,发现了问题的根本所在,需要面部模型构建器(IFaceModelBuilder)。
好了,那么这是开始。还记得上节的CreateFaceModel函数没有?这个函数需要传递一个数组,称为
FaceShapeDeformations数组,在这里简单翻译为面形吧。这个储存了面部的特征点的模拟数据,可能的数据
比如说鼻子的高度模拟值,详细的还需官方SDK更新,现在啥也没有。
那么,如果已经储存了面形信息,CreateFaceModel时直接导入即可。没有就需要捕捉并构建了。
于是使用IFaceModelBuilder吧!
IHighDefinitionFaceFrameSource::OpenModelBuilder打开面部模型构建器
参数1: 构建属性:
enum _FaceModelBuilderAttributes{FaceModelBuilderAttributes_None = 0,FaceModelBuilderAttributes_SkinColor = 0x1,FaceModelBuilderAttributes_HairColor = 0x2} ;
比较简单,需要肤色那就0x1,需要发色就0x2,都需要就做按位或运算。我们这里仅需面形数据信息,就
FaceModelBuilderAttributes_None即可.
对了,我们这次需要支持简单的数据导入,所以可能会这样:
<span style="font-size:14px;"> // 创建高清面部帧源if (SUCCEEDED(hr)){hr = CreateHighDefinitionFaceFrameSource(m_pKinect, &m_pHDFaceFrameSource);}// 创建面部模型构建器 之前常试从文件中读取数据if (SUCCEEDED(hr) && !read_fsdfile_data()){hr = m_pHDFaceFrameSource->OpenModelBuilder(FaceModelBuilderAttributes_None, &m_pFaceModelBuilder);}// 开始数据收集if (SUCCEEDED(hr) && m_pFaceModelBuilder){hr = m_pFaceModelBuilder->BeginFaceDataCollection();}</span>
IFaceModelBuilder::BeginFaceDataCollection
开始数据搜集
也是简单易懂, read_fsdfile_data()方法常试读取数据。
我是这样实现的,果然IO还是纯C好点
<span style="font-size:14px;">// 常试FSD读取文件
bool ThisApp::read_fsdfile_data(){FILE* file = nullptr;;size_t ok = reinterpret_cast<size_t>(m_pFSDFileName);// 打开文件if (ok){file = _wfopen(m_pFSDFileName, L"rb");size_t ok = reinterpret_cast<size_t>(file);}// 读取信息if (ok){auto length = fread(m_ImagaRenderer.data.sd, 1, lengthof(m_ImagaRenderer.data.sd), file);ok = length == lengthof(m_ImagaRenderer.data.sd);}// 设置已获取if (ok){m_bProduced = TRUE;m_ImagaRenderer.data.co_status = FaceModelBuilderCollectionStatus_Complete;}// 关闭文件if (file){fclose(file);
#ifdef _DEBUGfile = nullptr;
#endif}return ok != 0;
}</span>
IFaceModelBuilder::get_CollectionStatus
获取搜集状态,搜集状态有
<span style="font-size:14px;">enum _FaceModelBuilderCollectionStatus{FaceModelBuilderCollectionStatus_Complete = 0,FaceModelBuilderCollectionStatus_MoreFramesNeeded = 0x1,FaceModelBuilderCollectionStatus_FrontViewFramesNeeded = 0x2,FaceModelBuilderCollectionStatus_LeftViewsNeeded = 0x4,FaceModelBuilderCollectionStatus_RightViewsNeeded = 0x8,FaceModelBuilderCollectionStatus_TiltedUpViewsNeeded = 0x10} ;</span>
FaceModelBuilderCollectionStatus_Complete
面部信息搜集完毕,状态就是这个
FaceModelBuilderCollectionStatus_MoreFramesNeeded
还需要其他位置信息,接下来4个状态存在任意一个状态,该状态置为1
FaceModelBuilderCollectionStatus_FrontViewFramesNeeded
需要正面帧数据,面部朝着Kinect即可
FaceModelBuilderCollectionStatus_LeftViewsNeeded
需要面向左边(几乎90度)
FaceModelBuilderCollectionStatus_RightViewsNeeded
需要面形右边(几乎90度)
FaceModelBuilderCollectionStatus_TiltedUpViewsNeeded
需要斜向上(目测需要45度),但是笔者的Kinect置于高处,这个需要90度抬头,简直
还需要值得提到的是,有耳机最好摘掉,会提高收集成功的概率
错别字就不要在意了,代码已经上传了,改也没有意义了.
IFaceModelBuilder::get_CaptureStatus
获取采集状态,就是提示用户的姿势是怎样不对的,基本不动就没事
enum _FaceModelBuilderCaptureStatus{FaceModelBuilderCaptureStatus_GoodFrameCapture = 0,FaceModelBuilderCaptureStatus_OtherViewsNeeded = 1,FaceModelBuilderCaptureStatus_LostFaceTrack = 2,FaceModelBuilderCaptureStatus_FaceTooFar = 3,FaceModelBuilderCaptureStatus_FaceTooNear = 4,FaceModelBuilderCaptureStatus_MovingTooFast = 5,FaceModelBuilderCaptureStatus_SystemError = 6} ;
这个不多说
采集成功后,使用IFaceModelBuilder::GetFaceData可以获取IFaceModelData,
居然不是小写的,微软在想什么╮( ̄▽ ̄)╭
获取之后IFaceModelData::ProduceFaceModel来生成面部模型,记得释放之前的模型哟
代码差不多就是这样,请注意,我试验后发现构建IFaceModelData::ProduceFaceModel模型需要几秒钟,
简直影响用户体验,所以建议保留数据,下次
// 检查面部模型构建器if (SUCCEEDED(hr) && !m_bProduced){IFaceModelData* pFaceModelData = nullptr;// 检查收集状态hr = m_pFaceModelBuilder->get_CollectionStatus(&m_ImagaRenderer.data.co_status);// 检查采集状态if (SUCCEEDED(hr)){hr = m_pFaceModelBuilder->get_CaptureStatus(&m_ImagaRenderer.data.ca_status);}// 采集成功 获取数据if (SUCCEEDED(hr) && m_ImagaRenderer.data.co_status == FaceModelBuilderCollectionStatus_Complete){hr = m_pFaceModelBuilder->GetFaceData(&pFaceModelData);}// 生成面部模型if (SUCCEEDED(hr) && pFaceModelData){SafeRelease(m_pFaceModel);hr = pFaceModelData->ProduceFaceModel(&m_pFaceModel);}// 检查结果if (SUCCEEDED(hr) && pFaceModelData){m_bProduced = TRUE;// 顺便输出数据m_pFaceModel->GetFaceShapeDeformations(lengthof(m_ImagaRenderer.data.sd), m_ImagaRenderer.data.sd);}// 释放掉SafeRelease(pFaceModelData);}
差不多就这样:
下面再说说采集的信息:
笔者的方法自然简单:
case WM_KEYDOWN:if (wParam == 'S'){FILE* file = nullptr;BYTE buffer[FaceShapeDeformations_Count * 64];size_t now_length = 0;if (!_wfopen_s(&file, L"FaceShapeDeformations.txt", L"wb")){memcpy(buffer, pOurApp->m_ImagaRenderer.data.sd, sizeof(pOurApp->m_ImagaRenderer.data.sd));char* index = reinterpret_cast<char*>(buffer+sizeof(pOurApp->m_ImagaRenderer.data.sd));*index = '\r'; ++index; *index = '\n'; ++index;float* data_index = pOurApp->m_ImagaRenderer.data.sd;for (int i = 0; i < FaceShapeDeformations_Count; ++i){now_length = sprintf(index, "%f\r\n", *data_index);index += now_length;++data_index;}fwrite(buffer, 1, reinterpret_cast<BYTE*>(index)-buffer, file);}if (file){fclose(file);file = nullptr;::SendMessageW(hwnd, WM_CLOSE, 0, 0);}else{::MessageBoxW(hwnd, L"储存失败", L"Error", MB_ICONERROR);}}break;
但是简单两次采样的数据大致如下:
可以看出数据波动较大,解决办法只有多次采样抵消了。算法不少,最简单的平均法。
也可以假定服从N(μ, σ^2)的正态分布,利用《概概率论与数理统计》中的方法计算,不多说了(其实是不会)。
调试可以传递一个参数,表示文件的路径:
正式使用更简单了,直接把输出文件拖到exe文件上即可。
范例下载地址:点击这里
这次我学精了,提前上传,不过错别字
Kinect for Windows SDK v2.0 开发笔记 (十三) 高清面部帧(4) 面部模型构建器相关推荐
- Kinect for Windows SDK v2.0 开发笔记 (十) 高清面部帧(1) FACS 介绍
转载于:https://blog.csdn.net/dustpg/article/details/38892783 使用SDK: Kinect for Windows SDK v2.0 public ...
- Kinect for Windows SDK v2.0 开发笔记 (五)骨骼帧与笑面男
(转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 public preview 这次说说这骨骼帧的获取.嗯,Kinect买来就为这个啊.不然其他数据,买其他产品 ...
- Kinect for Windows SDK v2.0 开发笔记 (十二) 高清面部帧(3) 面部模型(2D)
(转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 public preview1409 同前面,因为SDK未完成,不附上函数/方法/接口的超链接. 是的, ...
- kinect for windows SDK 2.0下载和kinect 2安装调试
kinect v2价格便宜.功能强大,很适合用来做三维重构开发研究.下面,简单记录一下Kinect2及其开源包kinect for windows SDK 2.0的安装与调试.我买的设备是xbox o ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境...
1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)...
1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...
- 《ArcGIS Runtime SDK for Android开发笔记》
开发笔记之基础教程 ArcGIS Runtime SDK for Android 各版本下载地址 <ArcGIS Runtime SDK for Android开发笔记>--(1).And ...
- [译]Kinect for Windows SDK开发入门(八):骨骼追踪进阶 上
前7篇文件我们介绍了Kinect SDK中各种传感器的各种基本知识,我们用实验的方式演示了这些基本对象和方法的如何使用,这些都是Kinect开发最基本的知识.了解了这些基本知识后,就可以开发出一个基于 ...
- Kinect for Windows SDK开发入门
Kinect for Windows SDK开发入门(一):开发环境配置 首先来看一下Kinect设备: 1. Kinect设备 黑色的Kinect设备如下图:基座和感应器之间有一个电动的马达,通过程 ...
最新文章
- 滚动触发的翻转式文字引用效果
- 22、Java Swing JTable:表格
- asp.net ajax检查用户名是否存在代码
- [免费网络研讨会] Java 11的第一印象
- Airflow 中文文档:命令行界面
- 浅谈CDQ分治与偏序问题
- 修改mysql数据库默认字符集_MySQL数据库之修改mysql默认字符集的两种方法详细解析...
- pdf屏幕取词 android,金山词霸Android版更是独家实现了手机屏幕取词和摄像头取词功能...
- ubuntu1804系统设置在哪里_Ubuntu 1804.4 server版本的安装及配置网络和图形化界面
- 什么样的企业要使用360评估?
- win10 小娜搜索没法用(语音能用 搜索框不能用)
- 2023浙江工商大学计算机考研信息汇总
- mark一下江南一点雨的微人事开源项目
- ubuntu anaconda 3.6.4 zipimport.ZipImportError: can't decompress data; zlib not available Makefile:1
- 全球及中国可编程图形计算器行业研究及十四五规划分析报告
- SpringBoot整合RabbitMQ消息队列
- MTK 手机芯片 2014 Roadmap
- TNS-12547: TNS:丢失连接
- 图文详述:下载安装JDK,搭建Java开发环境,并运行第一个Java程序
- 程序猿,你也配吃10元的盒饭?
热门文章
- 笔试中怎么答产品设计类题目
- Windows系统开通sftp服务
- 多传感器时频信号处理:多通道非平稳数据的分析工具(Matlab代码实现)
- 共享单车泡沫破灭,自行车产业链的每个环节都被波及
- 2020 GDUT Rating Contest III (Div. 2) B - Loan Repayment 题解
- 深入浅出Flask PIN
- 计算机界五位巾帼英雄
- 以下选项中、不是python对文件的打开模式的是_以下选项中,不是Python对文件的打开模式的是...
- python将经纬度标注在地图上_python读txt与写excel,将经纬度坐标点显示在地图上...
- 【081】Remove-无需注册的在线免费抠图工具