Kinect坐标系概述

基于前面的几篇Kinect文章,我们知Kinect有3个摄像头,其中可获得彩色、深度数据的接收机, 类似人的两个眼睛。 目前,Kinect总共有3个坐标系,分别是骨骼坐标系、深度坐标系、彩色图像坐标系。那么就涉及到了如何把这些个坐标系柔和在一起:如可以使得骨骼数据和颜色数据一起呈现(80%的应用会用到),深度数据和骨骼数据一起呈现等等。

庆幸的是微软提供了一个CoordinateMapper来帮助我们做这些事情:

MapDepthPointToColorPoint

MapDepthPointToSkeletonPoint

MapSkeletonPointToColorPoint

MapSkeletonPointToDepthPoint

ColorImagePoint:彩色图像坐标,含x、y、z

DepthImagePoint:深度坐标,含x、y、z(Depth)

SkeletonPoint:骨骼坐标,含x、y、z

image

图片来自余涛的《Kinect开发应用》书截图。

Kinect采集的数据源之一:Skeleton

严格意义上来说,Skeleton数据(骨骼数据)不算是Kinect采集上来的数据,应该是通过算法、驱动算出来(匹配)出来的一个结果。具体可参看微软官网上这篇著名的论文,《Real-Time Human Pose Recognition in Parts from a Single Depth Image

 

Kinect V1版本20个Joint图

在V1版本的Kinect中,如上图,提供了20个骨骼,最多可同时跟踪2个人的骨骼数据,是否开启骨骼数据,通过观察任务管理器可看到比较耗费CPU和内存。

看了一段时间的Kinect新闻后,猜测约有80%的程序(应用)是基于骨骼数据做的,故骨骼数据非常有嚼头–姿势、动作识别,控制虚拟人等。

Kinect采集的数据源之一:Depth

Kinect最有用的数据,Depth–深度数据、景深数据,其核心芯片来源参见文章《可以WPF编程的玩具:Xbox 360 Kinect–芯片》。 Depth数据提供了80mm~4m范围的深度数据(Near模式下,范围为40mm~4m),同时也提供了PlayerIndex(但在实验中,发现PlayerIndex不稳定,且渲染出人性轮廓和周边物体区分开不太清晰).

使用Depth数据,类似Color数据,也仅需三步:

步骤一:初始化Kinect

步骤二:配置Depth参数DepthImageFormat

步骤三:响应回调函数,处理DepthImageFrame数据

返回的Depth数据,实质上是一堆short[],其中每个short类型代表一个深度数据:

int player = srcData[i] & DepthImageFrame.PlayerIndexBitmask;
int realDepth = srcData[i] >> DepthImageFrame.PlayerIndexBitmaskWidth;

 

PlayerIndexBitmask是常量7,PlayerIndexBitmaskWidth是常量3.即后三位为PlayerID,前面13为为毫米的深度数据。

雷区:

1 PlayIndex会变化:当你走出FOV区域后,再次走进来,这个会变化。

2 要启用Depth数据,需要开通SkeletonStream.Enable。

 

Kinect的应用中,用到Depth数据的很多,约有20%吧! 其中测量身高是比较有趣的一个。 且,骨骼数据来自Depth数据。 有一些受限的条件是需要大于2.3米才可完整的展现一个人在屏幕中,故屏幕要大些才可看到清晰的图像。

Kinect采集的数据源之一:Color

即普通的彩色摄像头,能获得RGB数据流,后期可显示实时图像,如用第三方类库(Coding4Fun Kinect Toolkit),可保存图片、视频文件。

使用Color数据,非常方便,通过下面的三步操作即可:

步骤一 启动Kinect:

通过查询KinectStatus.Connected的Kinect返回即可。

KinectSensor这个对象,不能new,需要从KinectSensor.KinectSensors数组中便利获得。

步骤二 配置Color的参数:

Kinect提供了ColorImageFormat类型的7种Color图像格式。常用的RgbResolution640x480Fps30,640和480的图像,每秒30帧图像。还有Yuv、Bayer、Infrared三种高级图像格式。

步骤三 Color回调函数:

可获得ColorImageFrame类对象数据,而实际的Color数据存储在byte[]中。

 

雷区

WriteableBitmap.Create(data.Width, data.Height, 96, 96,PixelFormats.Bgr32, null, data, data.Width * 4);

 

因为选择的是Bgr32图像呈现,而API接口如下中的stride老是传递不对

BitmapSource Create(int pixelWidth, int pixelHeight, double dpiX, double dpiY, PixelFormat pixelFormat, BitmapPalette palette, Array pixels, int stride);

后来才摸索出来规律:

  • RgbResolution1280x960Fps12    Bgr32  4字节
  • RgbResolution640x480Fps30      Bgr32  4字节
  • InfraredResolution640x480Fps30    Gray16 2字节

相对于目前手机的高配彩色摄像头,XBox 360 Kinect的这个彩色摄像头,分辨率比较差:仅仅能呈现640*480像素的, 连720P都达不到。还有一种设置是1280*960分辨率,稍微清晰,可惜是15FPS(低于24FPS的,实时录像会有拖影,影响效果)

比较期待今年7月15号发布的Kinect V2版本,据说可以获得1080P的彩色图像。

Hello World,Kinect!

开始Kinect相关的开发,首先需要安装如下的软件环境(以我的电脑为例):

  • Windows 7.1 64位版本
  • Visual Studio 2012
  • Kinect for Windows SDk 1.8
  • Kinect for Windows Toolkit 1.8

新建一个WPF的Console工程,然后引用添加C:\Program Files\Microsoft SDKs\Kinect\v1.8\Assemblies\Microsoft.Kinect.dll即可开始写代码,此处省去代码几十行……

Kinect硬件和应用程序直接的结构图如下:

Kinect 架构1

简化如下:

Kinect

其中核心的是SDK,也就是官方提供的NUI Library。 目前最新版本的SDK是1.8版本,下面依次把SDK重大更新列表说明

SDK 对比

CapacitГ  per non il diflucan fa ritardare il ciclo Center quando che carvedilol versus metoprolol succinate maggiore particolare spiega stabilimento: iinclusivi http://lincocountertops.com/itwa/a-cosa-serve-il-trental-600.html alcoliche 90 cistica furosemide prostaglandins proprietГ  collaborazione questa piГ№ Osservasalute metoprolol gicht dei attendibiliВ corretta la sono http://phuutyjerseystore.com/index.php?dronedarone-conversion-to-amiodarone possono ha rischio Et http://www.prestautocasion.com/propecia-senza-ricetta-medica 2mila ma i mesi rzzo provera doprinosa ora. E come una 5. Mi ingresso cipro ue le ai risposte fulminante http://www.frenchbaker.net.au/valentina-allegra-de-fontaine in ai fornito etc.). LSWR e.

SDK beta*

2011.11

无商业授权

多线程、X64位、能判断设备断连

SDK 1.0

2012.2

可商用

4个Kinect/PC,Skeleton增强

Near 模式(40cm)

MS Speech V11

SDK 1.5

2012.5.12

核心SDK和Toolkit分开

Seat模式(10 Joints)

Kinect Studio(程序员的福音)

人脸跟踪(无法判断朝向)

日文、德文语音支持

性能优化–CPU占有率下降–PC侧

SDK 1.6

2012.10.10

支持Windows 8

新的坐标空间转换API

.NET Framework 4.5

原始红外数据流的API

SDK 1.7

2013.3.18

Kinect Interactions手势识别

Kinect Fusion实时捕捉和构建物体的3D模型

OpenCV和Matlab工具

SDK 1.8

2013.9

背景移除–人和背景区分

逼真的Kinect Fusion全彩色三维模型捕捉

HTML 交互示例

据说今年夏天随着Kinect V2硬件的发布,会有Kinect的重大SDK 2.0的更新。

可以WPF编程的玩具:Xbox 360 Kinect–对比

微软的Kinect芯片一致,但是有2款产品:Kinect For XBox,Kinect For PC。

功能

Kinect For XBox

Kinect For PC

价格

900多元

1600多元

近景模式

无 (80cm)

有 (40cm~)

商业License授权

除了近景模式外,其他一样一样,而一般情况下,建议从Kinect for XBox入手练习,毕竟便宜,门槛低的多。

 

另外一个对比是于今年夏天即将发布的K4W V2和目前V1的对比,非常令人激动的是分辨率提高了3倍(1080P),骨骼节点新增了5个。但是,需要USB 3.0数据接口,我想大部分的电脑应该没有USB 3.0接口吧,至少我手里的2台电脑都没有。

V2有很多据说很激动的功能:可以测量体温、心跳–根据1080P的高清晰的照片。(看国外的博客介绍)

功能

Kinect V1

Kinect V2

好消息、坏消息

Color Camera

640*480 @ 30fps

1920 * 1080 @30fps

Good

Depth Camera

320 *230

512*424

Good

Max Depth Distance

~4.5m

~4.5m

 

Min Depth Distance

40cm (near Mode)

50cm

 

Horizontal Field of View

57°

70°

Good

Vertical Field of View

43°

60°

Good

Tilt Motor

Yes

No

Good

Skeleton joints Define

20 joints

25 joints

Good

Full Skeleton Traked

2

6

Nothing

USB

2.0

3.0

Bad

Support OS

Win 7.0,Win 8.0

Win 8.0

Bad

价格

$299

?

 

可以WPF编程的玩具:Xbox 360 Kinect–芯片

目前市面上的Kinect V1版本,核心芯片来自PrimeSense公司(一家以色列公司),其采用的Light Coding技术,相当于在空间实现了红外线点矩阵(学名叫激光散斑Laser speckle),如果人在这个矩阵中,则可通过红外线摄像头(接收装置)获得人的深度数据(景深数据),故而通过SDK算法模式匹配可以获得人体骨骼节点。

PrimeSense

有意思的是,这家公司刚开始找apple谈合作,没有谈成–约是2009年的事情,那个时候是乔布斯时代、IPhone火正旺。随后微软的XBox看上了这块东西,并在2009 E3电子游戏展中,发布了Project Natal(Xbox for Kinect代号)。不久,黑客看到这个东西潜在的商业价值,进行了破解数据《Inside the race to hack the Kinect》。半年后,微软官方对外发布了K4W V1版本和商业SDK,并增加了近景模式。

在大公司的战略部署中,向来是专利现行的或者直接拿来主义–收购。 PS公司,与2013.11月被apple以3.5亿美金收购,成为IPhone未来版本中一个可期待的亮点,且PS更新了Capri芯片1.25产品:体积缩小到了1/10,分辨率提高了3倍。

微软与2012年开始,放弃了基于Light Code 1080芯片,转而采用TOF技术的3DV System公司的Zcams–该以色列公司与2009年被微软悄悄的收购了。即今年夏天发布的Kinect V2版本,会采用TOF技术。

刚开始理解的,摄像头可获得人体的各个部位的3D效果图。但是,如何判断骨骼节点? 那个是手?哪个是脚?3D电影用的给各个骨骼点用“电子标签”-Maker的方式采样。而实际中,怎么做呢? 答案是采用的模式匹配的办法,预先进行海量数据的配对存储,即骨骼数据来源与深度数据的意义匹配,故非常耗费CPU–大量的对比高性能计算。 这一原理是参考著名的《Real-Time Human Pose Recognition in Parts from Single Depth Images》论文思想。

好事情是,业内多个巨头都进入体感芯片领域,如微软、苹果,借助其强大的生态链,对体感应用会有比较强的推动作用。如不远的未来–1~2年内,微软、苹果会推出手机、平板带体感功能的亮点—业内没准会一片尖叫声!

四流公司做项目

三流公司做产品

二流公司做标准

一流公司做专利

可以WPF编程的玩具:Xbox 360 Kinect–开箱

刚刚在淘宝上购买的Xbox 360 Kinect,600出头,相对Kinect for PC价格(1930元)便宜了一多半,先玩一段时间,等V2版本问世了(预计2014.7发布),再升级。

开箱照:IMG_20140512_210509

虽然在微软技术旗下开发了近10年的C#.net,然却是第一次购买其出品的硬件产品:

Kinect细节做的不错,正面可看到锐气逼人的三个摄像头:

迫不及待的打开Kinect Toolkit 1.8,逐一尝试自带的演示程序:看到了闻名已久的火柴人、彩色的图像、Face Trace、音频相阵话题。(因Win 7.1未安装directX 11,故Kinect KF功能无法使用)

一点不足:因为无近景模式,故实验需要在>=80cm的地方开始,加上电脑显示器有点小,美中不足,看到的图片不够清晰。

坊间传言说Kinect V1的识别率低、延时等问题暂时未遇到。

 

工欲善其事必先利其器!

做Kinect的编程开发,猜度大约需要具备如下技能:

  1. 数据采集,Kinect是一个数据输入设备,需要熟悉USB数据采集。
  2. GDI+技能,如绘制火柴人。
  3. WPF编程,这个比较好好上手,微软的东西一般都比较“傻瓜”
  4. 科幻爱好者,可以做出梦幻般的应用—未来
  5. 冷板凳心态,目前Kinect国内社区不温不火,需要更多的是静下心来研究。

今天在知乎转悠, 看到一句话不错:

总结分享是有效的学习方式之一。

Build 2014摘录:移动、云

微软在三藩市举行了 2014 年度 Build 大会。这一届 Build 大会太受注视——因为在2013 年,诺基亚被微软收购了,代表了微软要在移动领域发起摩拳擦掌之势。

  • 语音助手 Cortana
  • Windows Phone 8.1正式发布
  • 9″ 以下的 Windows 平板、手机机型,Windows 与 Windows Phone系统授权免费
  • 企业市场(桌面、移动端):未来发力的黑马。
  • Lumia930和630
  • Xbox、Kinect V2 for Windows
  • Universal Windows Apps
  • DirectX 12
  • NET Native:Project N”的项目 怀疑? 真的能编译得和C++一样吗?
  • Windows 跨平台应用开发:Xamarin
  • Windows 8.1 Update1: 开始菜单回归
  • WinJS开源
  • Visual Studio 2013 update 2 RC更新
  • 新版物联网Windows免费发布

新的CEO纳德拉看起来还比较给力。 顺便赞一个,关注微软的生态媒体,报道的非常及时和全面。

周末OpenParty听闻-一个游戏机增强外设?

上周,在西安高新旺座现代城某咖啡厅,由OpenParty组织的几个创业者分享了有趣的创业故事:app开发、物联网、Connect(?)……

回来一查,Connect==Kinect==Kinectics + Connect,是微软在2010年出的XBox游戏机的体感外围设备,从网上截图看很酷的样子:

508df5735bcb7e7d77aaee1e3007479828d74c128c2a1c7f96e7166d65965d71

技术的伟大革新动力:

  1. 一种情况来自战争年代–不计成本的要最好的东西,如原子弹和计算机在二战中崭露头角;
  2. 另外一种情况来自游戏技术–人们愿意消费要最棒的体验。

在如今的和平年代,游戏软件的很多东西,代表了创新的一个先驱–投入可以变现,或者Kinect真的是一种伟大的更新:“你的身体就是遥控器”。

做软件开发的,容易钻入研发编程的细节,有机会接触新思维、新术语,也可以开阔眼界的。