Kinect for Windows SDK v2.0 开发笔记 (十五) 手势帧



(转载请注明出处)

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

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

这次终于是新的东西了,是“手势帧”,不过原名是“可视化手势构建器”(Visual Gesture Builder)帧,是

SDK 2.0自带的手势解决方案,不过,如果您觉得微软写得不可靠,甚至垃圾,您可以尝试自己写个,笔者在

提供的范例中,写了个简单的样子(几十行而已,不要期望过大)。

好了,这个可视化手势构建器(后面简称手势),需要包含头文件

#include <Kinect.VisualGestureBuilder.h>

需要链接静态库

#pragma comment ( lib, "Kinect20.VisualGestureBuilder.lib" )

这部是可选的,您可以显式动态链接dll文件:"Kinect20.VisualGestureBuilder.dll",也可以

使用这个库文件隐式动态该文件,还需要原SDK中某vgbtechs文件夹下面的2个dll文件。

使用VS的生成事件即可,请注意x64还是x86.

还有就是,这个手势数据库是由SDK2.0自带的工具生成的*.gbd文件。

这节仅仅是说明怎么使用这个文件,至于怎么使用工具创建文件,应该是下节吧。谁知道

可能大家看过了SDK自带的“Visual Gesture Builder Viewer”了:

因为手势帧有点简单,我们就仿造这个做一个吧:

0. 支持任意窗口尺寸

我们之前的例子一直是固定窗口尺寸,这次可以改变窗口大小了,需要响应WM_SIZE消息

    为了方便地改变窗口,我们使用D2D 1.0中的D2D1HwndRenderTarget,因为自带了Resize方法.

1.添加图标,我们使用Kinect SDK自带的图标吧

复制app.ico到工程下后,在工程里面添加一个*.rc文件,右键,查看代码,不要编辑,毕竟Express版无法编辑。

写上

1 ICON "app.ico"

1代表编号    ICON代表类型     "app.ico"代表文件名

这样编译,程序自动就会添加图标了。

接下来给程序添加图标:注册窗口时

   wcex.hIcon = LoadIconW(hInstance, MAKEINTRESOURCEW(1));

    那个1就是之前rc文件填的编号,即可

2.支持窗口文件拖拽:

先注册能够进行文件拖拽: DragAcceptFiles(m_hwnd, TRUE);

之后再响应WM_DROPFILES消息即可

3.新的花样

我们之前使用基于等待垂直同步的轮询模式,也使用了基于消息的事件模式.这次我们使用基于计时器的轮询模式。

一个SetTimer即可,操作系统的时间片一般是20ms,所以我们就20ms的计时器吧,反正高于30FPS;

4. 渲染策略

在左边渲染彩色帧深度帧骨骼帧,简直就是把最前面几节的代码复制过来。

在右边可视化手势结果。

SDK 自带的手势解决方法中,手势分为两种:

离散手势连续手势

enum _GestureType
    {
        GestureType_None	= 0,
        GestureType_Discrete	= 1,
        GestureType_Continuous	= 2
    } ;

简单过程: (轻车熟路了, * 是可能需要动态修改的)

创建手势帧源(CreateVisualGestureBuilderFrameSource)

* 添加手势(IVisualGestureBuilderFrameSource::AddGesture(s))

* 删除手势(IVisualGestureBuilderFrameSource::RemoveGesture)

* 更换跟踪ID(IVisualGestureBuilderFrameSource::put_TrackingId)

打开读取器(IVisualGestureBuilderFrameSource::OpenReader)

轮询获取手势帧:(IVisualGestureBuilderFrameReader::CalculateAndAcquireLatestFrame)

获取相应结果

    IVisualGestureBuilderFrame::get_ContinuousGestureResult

IVisualGestureBuilderFrame::get_DiscreteGestureResult

这两个方法,参数均是: 第一个想要获取结果的手势, 第二个是对应的结果。

从这个可以看出:

将两种手势分开储存可以减少方法调用,但是为了方便,这里就没有分类;

手势结果有:

连续型: 进度(float)

离散型: 结果(boolean), 置信度(float), 是否为首帧(boolean)

那么,问题来了!游戏编程哪家强?

怎么获取手势呢?

CreateVisualGestureBuilderDatabaseInstanceFromFile

CreateVisualGestureBuilderDatabaseInstanceFromMemory

这两个可以获取手势数据库了,

    MIDL_INTERFACE("7FA8E82E-E43E-4DD6-A481-1E967DC4B7C8")
    IVisualGestureBuilderDatabase : public IUnknown
    {
    public:
        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AvailableGesturesCount(
            /* [annotation][out][retval] */
            _Out_  UINT *numGestures) = 0;

        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AvailableGestures(
            /* [annotation][in] */
            _In_  UINT32 capacity,
            /* [annotation][size_is][out] */
            _Out_writes_all_(capacity)  IGesture **availableGestures) = 0;

    };

笔者都不用说了吧。

至于可视化算法,这并不是重点,可以看看代码了解一下,写得比较乱.

不过这次的代码自己认为还写得不错,建议大家仔细看看

好了,这就是成果图了,彩色帧是黑色的,因为是关灯了,毕竟室友些睡觉了,像我这种人真蛋疼。

支持文件拖拽,改变窗口大小,比微软自带的好用点,就暂时代替微软坑爹的那个吧:

自己的电脑上关闭窗口,但是进程还未退出,微软您就慢慢坑吧

代码下载地址:点击这里
名字打错了,打成“面形”了,请不要在意这些细节

时间: 2024-10-23 18:43:56

Kinect for Windows SDK v2.0 开发笔记 (十五) 手势帧的相关文章

Kinect for Windows SDK v2.0 开发笔记 (十六) SDK2.0正式发布 与 自带工具

(转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 1409 来了,微软于10月22日正式发布了SDK v2.0,前兆是发现了API文档正常了... 话说为什么是1409而不是1410 于是从这节开始,开始附上API的超链接.正式版的体积也是可观,整整(比7月版)大了一倍 这节说说自带的软件,本打算录下来,但是太懒了 先附上微软自己的地址,Part1,Part2,这是手势的,虽然是使用C#,不过工具使用是完全一样的. 先看看SDK中自带的工具: 0. Kin

Kinect for Windows SDK v2.0 开发笔记 (十一) 高清面部帧(2) 面部特征对齐

(转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 public preview1408 根据前一节的说明,这节就是关于面部特征对齐的. 接口为IFaceAlignment,因为SDK还在Beta中,提供官网的连接可能会失效,所以不提供了. 需要可以到微软官方查询.目前,面部特征对齐主要可以干: 0. 获取面部外框 -- 面部帧也能.但是经测试,精度高得多,抖动大概在几像素内 1. 获取头部旋转中心 --结果是一个相机空间坐标,大致位置就是颈部中心 2. 获

Kinect for Windows SDK v2.0 开发笔记 (十三) 高清面部帧(4) 面部模型构建器

 (转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 public preview1409 同前面,因为SDK未完成,不附上函数/方法/接口的超链接. 这次让我们让面部捕捉更加稳定/精确吧! 自从一直8月有了高清面部帧的例子后,觉得IFaceModel::GetFaceShapeDeformations它不干正事,一直返回0.0f的数据. 与其他开发者简单交流后,发现了问题的根本所在,需要面部模型构建器(IFaceModelBuilder). 好了,那么

Kinect for Windows SDK v2.0 开发笔记 (十七) 深度帧3D

 (转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 1409 这节算是补充节吧,以3D方式显示深度帧,SDK更新的则在后面的章节说明. 之前想错了,以为每帧显示所谓的点云,GPU负担很大, 背景每帧都要传送 500 * 400 * 3 * 4 , 才2M的数据,之前估计错了. 3D接口依然是D3D11,这次简单多了,顺带复习一下吧 要点: 0. 初始化..  仅仅需要: IKinectSensor(使用 GetDefaultKinectSensor)

Kinect for Windows SDK v2.0 开发笔记 博客学习网址,Mark!!!

http://blog.csdn.net/u014365862?viewmode=contentshttp://blog.csdn.net/dustpg/article/category/2408183

实习小白::(转) Cocos2d-x 3.0 开发(十五)使用UILayout布局,制作对话界面

1.概述 上一篇我们在编辑器中设计了一个静态的UIScrollView,而通常我们都需要在程序中动态增加信息.插入元素的位置怎么确定?在3.0中UILayout已经实现了基本的布局,一起来看看吧: 2.编辑界面 打开CocoStudio的UIEditor 编辑一个界面,创建一个ScrollView和两个Button.因为ScrollView继承自UILayout,这里我们采用它.不太能搞定的童鞋可参考:Cocos2d-x 3.0 开发(十四)使用UIScrollView 实现大小不同物品拖动展示

Kinect for Windows SDK 2.0新特性

这些新特性包括, 1,改善的骨骼,手,关节方位------具有跟踪6个人全骨骼,每个人25个关节点(新增加手的中指指尖,拇指和shoulder center)的能力,以及对软组织连接和身体定位的改善. 2,支持新的开发环境------支持更快,高效,高品质的跨平台开发,让开发者使用已知的工具在Windows store 开发产品. 3,powerful tooling-----有了记录和playback 功能,让开发者可以摆脱必须有Kinect sensor的束缚. 4,进阶的脸部跟踪功能---

Kinect 开发 &mdash;&mdash; Kinect for windows SDK

开发 -- 基本的SDK和Windows 编程技巧(彩色图像视频流,深度图像视频流的采集,骨骼跟踪,音频处理,语音识别API) 深度数据,就是Kinect的精髓和灵魂,很多问题都转换为深度图像的模式识别问题 AForge.NET 是一套C#编写的Framework,提供计算机视觉,机器学习 www.aforgenet.com 图像处理需要消耗大量的计算资源,使用C#这类托管语言并不明智,应多使用OpenCV 应用层API详解 NUI API Kinect Audio DMO :提供束波成形和音源

VS2008下 使用C#做windows mobile 6.0开发 使用sqlite数据库

我使用的VS2008英文版的,不喜欢用中文版的. 现在用C#做相关开发,用到sqlite数据库. 网上找了很多,真正的教程特别少,都是贴的一堆垃圾代码.要么是无法配置通过的,错误一大堆,哎. 最后还是自己想办法解决了. 1.下载sqlite的运行库,首先网上的教程是让我们去http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki下载,但是页面上那么多,我们该选择哪个呢?   网页翻到最下面的  Legacy Ver