• 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到project下后,在project里面加入一个*.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;
            
        };
    


    笔者都不用说了吧。


    至于可视化算法,这并非重点。能够看看代码了解一下,写得比較乱.

    只是这次的代码自己觉得还写得不错。建议大家细致看看



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


    支持文件拖拽。改变窗体大小。比微软自带的好用点。就临时取代微软坑爹的那个吧:

    自己的电脑上关闭窗体。可是进程还未退出。微软您就慢慢坑吧


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

  • 相关阅读:
    备忘链接执行js时注意target必须是_self或者_top
    windows2003 Server远程连接Event Error;event id:12517,12503,1111
    网站配置了Url重写的Handler会导致虚拟目录找不到dll
    SEO 搜索引擎优化技巧
    11款开源Wiki管理系统
    收集了几个优秀的设计公司网站
    8款开源聊天系统和程序/Open Chat
    制作Web应用程序安装程序的方法
    转:推荐21套非常棒的网页设计图标素材
    14款开源文档管理系统
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6917451.html
Copyright © 2020-2023  润新知