kinect v2 面部模型

来源:互联网 发布:市场开发矩阵 编辑:程序博客网 时间:2024/04/20 17:08

原文 请戳这里

http://blog.csdn.net/dustpg/article/details/39455813


使用SDK: Kinect for Windows SDK v2.0 public preview1409

同前面,因为SDK未完成,不附上函数/方法/接口的超链接。


是的,微软在9月16日更新了SDK。没看具体更新内容,但是感觉上解决了一些bug,比如x86的Fusion。

这次说说高清面部帧的面部模型。


Kinect 2可以根据面部进行实时面部建模,感觉高大上,但是目前不能捕捉舌头,是个遗憾。

毕竟颜艺中舌头的地位可不低啊。


说到模型自然当然就是顶点集合啦,目前面部模型的定点数是1347,利用GetFaceModelVertexCount获取,

请注意这是函数,而不是宏定义,也就是说强烈建议使用动态分配,而不是静态分配。

嗯,1347,1+3+4+7=15,也就说是三角面咯。但是这节不涉及,毕竟这节是2D的,将顶点显示出来就好了。


怎么获取面部模型呢?首先,面部模型对应的接口是IFaceModel,使用IFaceModel::CalculateVerticesForAlignment

同前面,每(高清面部)帧需要更新面部对齐IHighDefinitionFaceFrame::GetAndRefreshFaceAlignmentResult.


那么怎么获取IFaceModel,一种方法是利用IHighDefinitionFaceFrame::get_FaceModel等(帧源也能),但是这样,

相当于每帧都会创建一个面部模型,即使我们释放掉,内存也没有回收。有点像内存泄漏,不过只是内部引用计数未归零。

这样会严重导致性能。所以使用函数CreateFaceModel即可,看参数名就知道了,很简单。


所以我们的大致步骤:


创建资源与事件

在高清面部临帧事件里面更新 面部对齐, 计算面部模型,将面部模型顶点映射为彩色空间

在刻画是顺便画这些点即可。


当然,还要保证跟踪ID有效,事件模式在多个事件就有点麻烦了,没有轮询模式简单。


为了效率,这里选择ICoordinateMapper::MapCameraPointsToColorSpace即数组转换,省去单个转换中虚函数的开销。


所以我们需要申请两块定点缓存,一个3D的一个2D的。

自然,动态内存分配需要时间,加上假设第一次分配成功但是第二次分配失败还要回滚。这里一次申请即可。

[cpp] view plaincopy
  1. // 创建顶点缓存  
  2. if (SUCCEEDED(hr)){  
  3.     m_pFaceVertices = reinterpret_cast<CameraSpacePoint*>(malloc(  
  4.         (sizeof(CameraSpacePoint) + sizeof(ColorSpacePoint)) * m_cFaceVerticeCount)  
  5.         );  
  6.     if (!m_pFaceVertices) hr = E_OUTOFMEMORY;  
  7. }  
  8. // 修改数据  
  9. if (SUCCEEDED(hr)){  
  10.     const_cast<const ColorSpacePoint*>(m_ImagaRenderer.data.face_points) =  
  11.         reinterpret_cast<const ColorSpacePoint*>(m_pFaceVertices + m_cFaceVerticeCount);  
  12.     const_cast<UINT&>(m_ImagaRenderer.data.face_points_count) = m_cFaceVerticeCount;  
  13. }  

也算是小技巧吧,不过因为使用了const,所以还有点麻烦。


差不多就是这样:


下载地址....见评论区或者到笔者资源区里面寻找,这连10kb的东西都要审核...

这次是2D,下次是3D,不知道是用D3D,还是抱Unity的大腿....


0 0
原创粉丝点击