微软亚洲工程院马宁:如何开发一款Kinect应用

微软亚洲工程院马宁:如何开发一款Kinect应用

来源 CSDN

2011年7月16日,TUP第十二期“移动开发技术沙龙——次世代人机交互接口及应用开发”在中国科学院计算技术研究所一层报告厅举行。本次活动邀请了微软亚洲工程院软件工程师马宁、神念科技大中华区总裁张彤和科大讯飞副总裁江涛,进行主题演讲。其中马宁为大家带来了大家所不知道的Kinect的那些事儿,通过一个关于奥巴马的笑话开场,奠定了整个演讲的欢乐氛围。

CSDN当然不会让没有机会来到现场的读者仅仅依靠一些微博上的消息来解渴,以下就是我们整理的现场马宁演讲实录,同时在文章末尾会有PPT演示。

2011年7月16日,TUP第十二期“移动开发技术沙龙——次世代人机交互接口及应用开发”在中国科学院计算技术研究所一层报告厅举行。本次活动邀请了微软亚洲工程院软件工程师马宁、神念科技大中华区总裁张彤和科大讯飞副总裁江涛,进行主题演讲。其中马宁为大家带来了大家所不知道的Kinect的那些事儿,通过一个关于奥巴马的笑话开场,奠定了整个演讲的欢乐氛围。

CSDN当然不会让没有机会来到现场的读者仅仅依靠一些微博上的消息来解渴,以下就是我们整理的现场马宁演讲实录,同时在文章末尾会有PPT演示。

谢谢大家,很高兴能够跟大家聊一聊。我叫马宁,现在微软亚洲工程院做产品开发。在04年开始就帮CSDN写移动开发的专栏。先做一个声明,今天所说只代表我自己。有些时间具体细节我们一块来探讨,回去之后大家直接在新浪微博上找就可以了。

接下来跟大家聊聊Kinect开发。Kinect主要用来进行体感游戏动作捕捉,后来大家发现这个非常有前途有价值,原因在哪?所有动作捕捉和识别都是做在硬件设备里面,但是Kinect其实是个变形的USB接口,所以接换到不同平台非常简单。在这样一个平台之下我们会发现有很多新的应用领域,等待我们去探索。

微软现在已经有两个SDK,第一个针对Windows,另外一个是针对微软机器人开发组件。以后可能微软会针对其他平台做开发。已经有开发者社区把Kinect往iPhone、Android上移植了,推广速度非常快。我们今天讲座以八卦为主,以技术为辅,尽量讲一些Kinect的事情,技术事情回头探讨。我们先插播一个非常严肃的科技新闻,这个一定要强调非常严肃的。最近在西方主流八卦媒体上流传着一条新闻,主角是英俊潇洒的奥巴马。大家开玩笑奥巴马通过远程控制方式直接亲手击毙了本拉登,这个到底是否真实,需要白宫发言人澄清。但是从那之后,奥巴马总统发现自己不但在政界混的风声水起,在游戏界也是如此。就问助手能不能不用手柄玩?就是Kinect上面的游戏,他准备去玩。这时候听到一个新闻,说最近实验证明Kinect在光线不足的情况下,对皮肤较黑的同志们识别不足。美国很多同志开始考虑Kinect这种技术是不是涉嫌种族歧视,在美国这很严重。在这时候一些开发者社区,说不能让我们总统连Kinect都玩不了!他们做了一个测试,估计在网上也应该能够看到一些视频,请了美国某明星做测试。具体测试的过程就不说了,总之最后测试结果表明,无论房间光线、环境、玩家肤色和穿着如何,用户体验是完全一致的。后面我也会从技术、Kinect原理给大家说一下,确实是没有任何关系的。

只是因为周末给大家讲个段子,简单让大家去了解一下,Kinect推出之后整个花边消息。这也是一个正常现象,开始一个新技术被大家所认识,花边新闻总是先占据大家视野。在后边整个演讲里面,请大家也抱着玩的态度,想想这个技术还能利用在哪些领域,有什么创意。很多看起来不靠谱很搞笑的思想,也许是下一个伟大产品的开始。我们插播完这条很严肃的新闻,接下来非常严肃。

第一介绍一下什么是Kinect;第二是Kinect的发展历史,虽然不是很长;第三介绍Kinect Windows SDK的整个开发过程;第四介绍Kinect开发环境、硬件和软件搭配;第五把Kinect主要的几个功能,用非常短的代码跟大家介绍一下;最后会有一个事例,当然这个事例也不是非常难。大家有时候开玩笑Kinect必须是双人,一个人站着,另外一个人在旁边协作,这就是我们今天所说的一些主要内容。

关于Kinect的大众所不知道的那些事

Kinect首先是一个XBox 360外接体感设备,通过无线方式捕捉动作感知。由PrimeSense提供Range Camera技术,同类产品如任天堂Wii、Play Station Move,必须让玩家手里拿一个或者多个设备,才能完成所谓体感互动。

Kinect最早定位是XBox 360外设,不需要任何道具完成整个动作识别和捕捉。他能够做的是两个,动作识别动作捕捉和3D立体语声识别。这是一个后台,所有的语音识别都是利用这个方式来做的。不过很遗憾,现在对汉语支持相对来说差一点,下面也会有语言识别方面专家来进行撰写,我们也特别希望能够把我们自己国内语言做的非常好。Kinect整个软件派发,之前也有一些八卦新闻,说Kinect技术是PrimeSense提供,然后找微软等等。任何一款成功产品都不是借助一个技术就能够实现的,所以在Kinect里有非常多的技术。

Kinect主要识别算法和软件部分都是公司提供的,他是微软旗下一个游戏工作室,是微软全资持有公司。识别算法、跟软件相关的一些逻辑都是由这家公司实现的。国内外也有一些所谓可见光、或者红外识别公司,他们也是从这家公司拿到一些著作权。大家可以试他们产品,跟微软还是有差别的差别。国内还是采取主机,算法是自己写的,或者通过其他方式来获取,相对精度差一点。

Kinect发展历史并不长。由于一些授权问题,如果在开发的过程之中就把软件名字发布出来,最大问题就是域名申请,当然还有其他很多问题。所以,不到产品发布那一刻微软的产品永远就只有CodeName,只有在产品发布最后1到2周的才会有一个正式名。当然也会存在一个问题,有的时候CodeName名字起的非常漂亮,到正式产品发布出来的时候名字也不是很好听。Kinect最早的CodeName是Project Natal。从2010年10月份开始上市,到2011年3月9号销售超过一千万部,有史以来销售最快的销售类电子产品。

另外,他可以是一个包装形式,也可以是一个单独外设,国外售价应该是169美金。但是在国内前两天有人给我留言,说淘宝已经卖到700多人民币。现在也有淘宝的朋友到我微博上拉生意了,还是非常有前途的。

前面我们也说过了,Kinect这个东西所有运算逻辑都是在预算本身完成的。说白了你只要实现一个USB,再做一个识别器就可以完成整个转换。所以,难度非常小,正由于这个原因现在被应用到不同领域里面。在微软发布官方Kinect SDK之前,有两个比较出名的项目,其中有一个openKinect。openKinect确实在配置和编程还有很多不足。而官方Kinect SDK整个配置非常简单,这也是微软一贯方式,他不但做了USB开发模式,还有相应API都做的非常好。Kinect的动作捕捉的机器学习技术,获得2011年MacRobert Award工程创新大奖。

Kinect技术指标包括:输出视频帧率为30Hz、B-bitVGA分辨率(640×480 pixels),由于识别率大家觉得能够支持手指识别,据说在下一步Kinect更新后,分辨率会大幅提升。那个时候去捕捉手指上的动作都是可以的。最佳识别区域是1.2-3.5m,并且由于房间限制,两边可扩展区域0.7-6m,两边是一个梯形状态。很多同志买了Kinect之后都感慨自己房间不够大,一般客厅在这边放一个电视,那边有一个沙发,空间确实不太够。后来有人想了各种各样的办法,比如把Kinect固定到你的液晶电视上,反正他所能够做的方式是千奇百怪的。

Kinect最多可以支持4个人的识别,但是真正有效的可视识别最多支持两个人。并且有一点,两个人的位置不能交叉。必须是一个人站在左边,一个人站在右边,不能一前一后或者其他方式,这是目前的技术上的限制。另外,他的可视区域水平范围是57度,垂直范围是43度,其实上下浮动角度可调。一种方式是水平向上,这种方式适合家里有电视机柜,还有放在电视机下面有一个俯视的角度,Kinect会自动调整俯仰角度。

每个人身上可以支持20个动作节点的捕捉,传统电影里面动作捕捉,美国是一个小时几千美金。你如果使用这个系统几千美金,Kinect使用是在你身上去粘各种各样的点,那种动作捕捉是非常精确,对于一些电影,或者游戏里面的动作捕捉是非常适用的。当然成本也非常之高,因为会把你人的3D影像跟一体动作全部输入电脑里面去,进行大量过滤还有处理方式。Kinect现在也有人拿它来做一个简单动作识别捕捉,当然了价钱非常便宜。但是,技术限制也非常明显,一个是捕捉点不够多。另外他只能够捕捉正面和侧面的一些动作,背面一些动作没法完全捕捉下来。现在Kinect只是能够替换掉一些简单的动作识别,或者动作捕捉的一些设备,不够把那种传统所谓复杂的动作识别,或者动作捕捉系统完全能替代掉,那套系统还是会在他的领域里面会运行非常好。但是Kinect的一个好处是,可以让一些更廉价的领域能够使用到所谓动作识别,和动作捕捉的技术,这是他的技术指标。

关于Kinect的开发和SDK

接下来是Kinect整个SDK一个介绍。首先这个SDK是由微软研究院来做,现在是一个非商业授权许可,这在国内大家不是很在乎,但是在国外要求非常严,你不能将这套SDK利用到所有的商业里面去,只能够利用到学校里面学术研究,还有所谓非商业用户。这个大家一定要清楚,否则会有问题。商业授权将在下一个版本中提供,至于采取什么样的授权方式现在还不确定。另外Kinect目前所能够支持的只有Windows 7这么一个操作系统,其他都不支持,所以大家别试图在Windows XP上装这套系统。当然了现在是支持Windows 32位版本,Visual Studio2010 Express以上版本,微软有一个专门计划为所有学生提供开发工具,还有微软软件的授权许可,所以大家也可以去找。

Kinect支持C++,C#,和VB.NET。如果大家感兴趣很多动态语言也都可以利用到这个,也都没有问题的。主要功能就是下面几种,首先第一个是sensor,作为摄象头使用;第二是所谓红外识别,数据都是可以通过Kinect SDK做到的;第三动作捕捉识别,最多可以追踪我们身上20多个节点;第四是语言识别捕捉,这都在Kinect里面做了很多。整个硬件大家也可以看得到,基本就这样一个很简单的东西。其中会包含这几个部分,第一部分他会有一个叫做RGB的camera,我们所有的可见光图象识别和图象来源都是来自于RGB的摄象头,对奥巴马总统有影响的还是这样一个摄象头。除了这个之外,前面各有两个摄象头,这两个摄象头识别是3D深度识别和感知器,作用是接受我们红外设备,目前不是主动式的,是被动式的,如果要是你的环境里面没有红外光源也是会受到影响的。

它的原理是利用双眼的觉差,能够判断我们当前某一个物体基于我们当前的一个位置,基本上都是通过红外方式来做判断的。所以,因为我们人体散发出来的红外是一致的,无论是什么人种,不会受到干扰的。除了这个东西之外,我们下面还有一个马达用来调整Kinect的俯仰角度,这是很重要的。另外在设备两端各自会有两组麦克风是用来做所谓3D识别,他的一个好处能够把声源附近之内各种各样信息捕捉到,不是一个简单转递,这是一个Kinect最简单的介绍。

如果你购买的是一个套装,加Kinect外加XBox 360设备,Kinect只会提供这么一个设备,外加这么一个接口,这是一体的。他的接口一般叫做AYS,就是一个USB。但是USB切掉一个角,这样一个情况你没有办法直接把这个设备插到PC上去,这是没有办法的。在我们拿到XBox 360新的主机上,叫瘦版,最新XBox 360主机有这么一个专门接口用来装Kinect设备。如果你买只有这么一个设备,想在Windows上使用Kinect设备,还需要另外一个组件。这个组件就是一个转换器,这个东西美国卖20美金,咱们淘宝才卖70块钱,所以咱们很幸福。如果你买的是一个XBox 360设备的时候,你还得买一个主机才能在Kinect,原因是必须提供这么一个转换头,其实也是为了监测XBox 360的设备,我这边再插一下。

硬件一个是需要Kinect Hardware另外是AC Adapter,PPT我可以发给大家进行下载。没有提供更多额外功能,能够帮助大家把开发难度降下来,这个东西建议大家去看一下,也是一套开源东西。这是我们一个最基础介绍,我可以让大家看一下我已经做好的,你创建完之后,知道添加什么东西,这个我们来看一下。开发是一个Visual。我们现在进行一个WCF,然后我们可以去添加Add Reference,反正就在这个里面大家回头可以试试。大家可以看到在项目里面会有Microsoft直接添加进来就可以了,还有一个Coding4Fun,这个不给大家说的很详细了。然后到了我们这么一个文件里面去,上面添加这几个,其实就是两个,一个是Kinect.Nui,我们进行类似识别,另外一个是Audio语言捕捉,最后如果需要添加直接分到Wpf这里面,这个功能非常简单。左边我可见光的动作,获取一个深度信息,就是一个红外光感知。我怎么样来做非常简单,首先我们来看代码,第一要添加一个Runtime nui,我们一个Runtime事例对应我们一个Kinect,会有一个显示以Initilize方式去试用,我需要用到动作捕捉等等都在后面。这是一个非常简单的东西,接下来有两个东西需要添加,一个叫做Video FrameReady,当你收到第一个数据的时候会进行自动复发,每隔一段时间都会复发这么一个事件。这后边我们会添加一个处理函数,接下来我们要增加这样一个Video Stream。他的Image Stream Type的方式,可以多指定几个。第一个我们To Bitmap Source,利用拓展方式进来。如果不用的话,我们用的是上面这一栏,首先我们e参数里面会有一个JmageFrame,出来一个PlanarImage,这些里面都是原始数据,我们如果想把它转换成我们能够识别的类型还需要去做一个Bitmap Source指定宽度、高度,还有一个颜色值等等这样一些信息,还有DPI的值,指定完成之后我们才能做相应一些转换。我们现在一般比较直接习惯于使用ToBitmapSource,但是建议大家不要直接在这里面这么写,这样写的话相当于都会进行自动保存,效率非常低。大家只有在一些关键的时候,或者你们要拍照的时候我们可以通过这个直接去做这样一个拍照,同理上面数据拿出来也是相同的东西,这个就不做非常相似的解释了。最后记着当我们程序关闭的时候,要利用这么一个方法把所有资源都释放掉,因为底层会封装很多资源在里面,还会进行一个释放才能够保证。当然也不会出现太大问题,这是一个最简单的事例。简单说一下,我们首先需要创建一个事例,封装一个Kinect sensor功能,我们需要用到哪些功能的时候需要指定。这是整个代码,包括Video事件和参数,这是我们一个简单调用方式,就不跟大家说了,大家可以看详细代码就行了。这是他的对象,我们传过来的参数会包括一个Fields,这里面会包括一个对象。

接下来跟大家说一下骨骼识别这部分,Kinect最多可以支持20多个骨骼点,数据对象类型是骨骼帧形式提供,每个帧里面最多可以保持20个点。大家还是看例子,这是一个非常简单的程序,识别5个骨骼点,包括我的膝盖,手,和头部的位置识别出来,其他位置,其实这些信息都是在里面的,大家如果觉得兴趣的话可以把这些信息加进去。因为他没有任何识别,所以现在是5个点,当他能识别我身体的时候,我们只能看到上面几个点,这是一个简单识别的方式。我们来看一下代码,前面基本上和我们前面的方式是一致的,也会创建一个Kinect的对象,另外我们的Runtime Options里面一定要加上骨骼识别。下面这一项增加转换,去掉一些噪声,如果不加去噪声功能的话,识别不到的信息。直接去调用FrameReady事件,有open的方式,为什么?这时候已经完成数据化了,大家可以发现那个事件没有被加进来。只有当他识别出一个人来的时候,才会有一个事件过来。所以,不需要加任何显示open方式就可以完成操作。我们参数里面获取到,首先进行获取,这里面所有动作已经被捕捉出来的动作电,捕捉完成之后会做这样一个搜索,把我们所需要用到一些点拿到,把他放在我们数据里面,接下来的话我们会把这样的数据附到对象里面去。但是需要提醒一点的是,他每一个点数据是从负一到一的浮点数,始终会在这个范围内摆动。所以,我们从负0.5到正0.5之间进行操作,这就是骨骼识别一些相应操作。接下来现在是一些已经出来的Sample Project。看到有一个兄弟玩超级玛丽,因为他没有做相应优化处理,必须要跳到一定高度才行,姚明同志可以去玩,潘长江就不用去了。还有一个虚拟试衣间,可以根据虚拟颜色,把这些虚拟衣服直接贴在你的身上,而且不会产生以前的问题,会跟着你的身体会动,这是一个现代比较多的事例。

另外,我听说也有一些国内公司在和一些医院合作,做这种所谓的手术识别远程遥控。所以,基本上这个都是我们一些事例。简单总结一下,Kinect是一个廉价的动作捕捉设备,几百块钱人民币,他应用对动作捕捉精度要求非常严格的领域,这是他未来发展的方向。另外他有可能,因为这个也是前面的问题,现在智能手机和平板电脑发展趋势非常猛的,将来以后他们的格局和PC格局怎么样发展,这个现在还没有一个争论,还是一个快速发展过程当中,但是Kinect以后绝对会有小型化趋势,这也是必须要走的趋势。另外专业领域和消费者领域,大家都知道专业领域用量不是那么大,但是他的技术更新相对来说会更快一些,因为他有这方面的驱动。消费者可能会稍微慢点,但是最后所有技术,所有专业领域一定会慢慢的,把所有技术都惠汇集到消费者领域,互联网其他技术都是这样产生的。在国内比较有希望的,比如展览展示,刚才我们说非触摸式操作领域,这些都是我们以后会努力的分享。另外现在大家都认可Kinect是一个非常好的技术,但是我们如何为好的技术寻找一个好的应用场景,这是我们接下来几年之内不断探索,不断尝试的方式。

提问:我们公司现在正在做Kinect相关开发,想问您两个问题,第一个问题您对Kinect未来发展有什么样的看法,有没有可能 以后成为一个一个标准外设,或者会不会在下一个操作系统当中去支持它?第二个问题目前还有一个驱动是openKinect不知道有没有试用过,本来想问一 下您,微软驱动和他们之间驱动区别?

我知道他们在做像Kinect相关的一些东西,我最早的时候试过 open Kinect确实碰到很多问题,后来微软标准版出来之后我再也没有试过那个东西。至于您前面那个问题,从长期来看,如果从技术这个层面来说,Kinect 已经具备成为下一个新的计算机交互方式可能性。但是一个好的技术转换成好产品过程,还是需要有很多工作。我们在一些专有设备上,现在非常热的互联网电视, 把这个东西作为摇控器解决方案。但是,我个人有一个看法正好也和大家交流一下,也不一定对。我觉得Kinect作为一个标准输入设备,在专业领域走的一定 会比所谓消费者走的要快。现在我们的PC,这个可能要从一个更大角度来看,我们现在处于一个从PC到智能手机,或者是平板电脑这样一个过度时期。当你硬件 设备交互方式发生变化的时候,你所谓外设方式很难被固定下来,只有当这种PC模式相对来说比较稳定的时候,我们才可能会看到最新的输入设备。所以,我觉得 对于专有领域可能他走的会更快,比如电视,或者是像我们服务产品里面应用领域可能会更广,对于PC上现在还不好说,或者说他可能还会要经历更长的时间才能 够有一个更好的发展,这是我自己个人看法。

提问:不知道微软内部有没有计划在操作系统层面去支持Kinect这么一个东西呢?

我也不是鲍尔默的秘书,他有什么想法我也不知道。我只能告诉你,在我所知道的行业内,一切皆有可能,但是一切都属于愿景开发,还没有进入产品开发流程,是不是有什么人在做不能保证。

PPT 演示

how to develop apps for Kinect