【Kinect+Processing】装置设计项目基础启蒙
John Underkoffler 说:“人手是世界上最复杂的操作工具。我们的想法是扔掉鼠标,让手取代它的全部作用。”
一个天才的杰作
最近有些小姐姐很苦恼地跟我讨论毕设的问题,诸如毕设难产、方向确定、技术难点等等。当然在此,我并不想深究解决之道,而仅欲与大家分享一个天才杰作——Pranav Mistry 的“第六感”。
完整版的视频链接,点击这里,或者 something more(FQ…)。
这套被 Pranav Mistry 命名为“第六感”的装置,包括了集合了包括摄像头和投影设备的挂在脖子上的长条装置、指尖的四色识别胶条和一部可以连接互联网的智能手机。值得一提的是,目前,这个由市面上常见硬件组装而成的设备成本是350美元!
日本中生代国际级平面设计大师原研哉说,“并不是仅仅只有制造出新奇的东西才算是创造,把熟悉的东西当成未知的领域再度开发也同样具有创造性。”
摄像头捕捉着手指的动作,识别周围的环境和动作的意义,并做出反馈。通过投影设备,任何物体表面都可以成为显示屏,将反馈的结果呈现出来。 Just like this:
好了好了,写了这么多,我无非就是想引出一个并不新颖的话题——自然用户界面(Natural user interface, NUI)。
一个阶段的过渡
基维百科的解释——
NUI 是指一类无形的用户界面。“自然”一词是相对图形用户界面(GUI)而言的,GUI 要求用户必须先学习软件开发者预先设置好的操作,而 NUI 则只需要人们以最自然的交流方式(如语言和文字)与机器互动。直观的说,使用 NUI 的计算机不需要键盘或鼠标。
其实,整个人机交互的发展历程就是人适应计算机到计算机不断适应人的过程。交互的信息也由精确的输入输出信息变为非精确的输入输出信息。
我们现在也处于一个由简单的人机交互界面向自然的人机交互界面的过渡期。从早期的手工作业、作业控制语言及交互命令语言,到图形用户界面(GUI)、网络用户界面,科技让我们不再局限于界面的美学形式的创新(当然,国内大多数的公司仍停留在这上面)。
而新的创意在于如何促使计算机更多地理解用户,从而更快捷、更符合他们的习惯地进行人机交互。在文档《人机交互发展历史》中提及,这一时期的主要研究内容包括:多通道交互、情感计算、自然语言理解、#虚拟现实、智能用户界面等方面。
嗯,各位正在苦恼的童鞋,将毕设方向往其上靠一靠,思路是否会变得清晰一些。那么接下来,容我为大家介绍一款融合了体感操作、人脸识别、语音识别等等的利器——Kinect。
一个大众的利器
Kinect 有一句有意思的宣言,“You are the controller。”
已经被微软停产的 Kinect,在市面上流通着两代产品:Kinect V1和 Kinect V2,如下图。
那么,两者究竟有何区别?从纯技术规范的角度来看——
图片来源:MSDN 上的 Channel 9 社区 Kinect 1和Kinect 2的产品规格细分。
总而言之,Kinect V2 具有更高的分辨率,价格貌似也低一些。就像这样:
图片来源:Here。
倘若你想了解更多,请参考视频:Kinect V1 Vs Kinect V2(来源:YouTube)。
所以下文关于硬件和开发的部分,笔者由于设备的关系,只能对 Kinect V2 加以学习和讨论。
论及 Kinect 硬件设备,也许我们只需了解它有“三眼四耳”的说法:
- 三眼——红外投影机、彩色摄像头、红外深度投影头。
- 四耳——L 形布局的麦克风阵列。
如图所示——
一个复杂的理论
是的,复杂的理论。很头疼,所以我便想到以一种简易问答的方式来向大家阐释,当然你亦可以深究,相信下文的学习资料会对你有帮助。
那么关于此,你有何疑问:
▼ Kinect 如何进行运动识别呢?
答:最为朴素的算法是基于动作序列的算法分析。正如词组匹配算法那样,你会考虑准备一个足够长的队列,然后根据预设的算法不断地扫描,中间可以可以用一些决策树进行有效的删减;或者,你实现一个“有限状态机”,去触发你预先定义的动作事件。(⊙﹏⊙),这使我想起了小时候经常玩的插卡的游戏“中国象棋”。依稀记得,在电视屏幕左上角会出现一长串数字序号,当玩家每下一步棋,那串数字就会更新一次,直到程序落子。可它却没有这些个删减法,每次都从头开始匹配,所以难度越大运行相对越慢。
▼ Kinect 如何获得深度数据?
答:Kinect 获得深度数据的原理如下:红色投影机的普通激光源投射出一道“一类普通激光”(Class Lasor),这道激光经过磨砂玻璃和红外滤光片,覆盖 Kinect 的可视范围,红外摄像头接收反射光线,识别目标物体的“深度场”(Depth Field)。注意,这里的激光会产生具有高度随机性的散斑,而且随着距离的不同会出现不同的图案。只要在空间中打上这样的结构光然后加以记忆就让整个空间都像被做了标记,然后把一个物体放入这个空间后只需要从物体的散斑图案变化就可以##知道这个物体的具体位置。
▼ Kinect 如何做到人脸识别?
答:Kinect 的人脸识别是基于彩色摄像头的信息,同时结合人的着装信息、身高来匹配的,属于纯二维的图片识别算法。这里我并不是很确定,我拿到的 Kinect for Xbox 360 人脸识别的原理。但你可以尝试基于 Kinect 提供的深度数据进行特征采集,提高人脸识别的精度。
……
一个实用的 Kinect v2 库
Kinect v2 library for Processing——
- Windows:KinectPV2,By Thomas Lengling
- Mac:Open Kinect for Processing,By Daniel Shiffman
库的安装要求:
- Kinect v2 设备(K4W2)
- Kinect SDK v2
- 64位计算机,专用 USB 3.0
- Windows 10,8,8.1
- Processing 3.0
- 更新视频卡驱动程序(一般不需要)
- 安装 DirectX 11(一种规范,详细解释)
安装步骤:
Step 1:安装 Kinect for Windows SDK 2.0;
Step 2:安装 Kinect v2 library for Processing(Processing Contributed Library 安装教程);
Step 3:Enjoy!
一个 Hello World基础知识(来源):
▼
倘若要在 Processing 中调用 Kinect v2 库,你只需导入并初始化之。
// 导入它
import KinectPV2.*;
KinectPV2 kinect;
void setup() {
// 初始化
kinect = new KinectPV2(this);
// 启动吧
kinect.init();
}
接着控制台就输入下面的内容…
64 windows 10
Loading KinectV2
Creating Kinect object ...
Done Loading Kinect V2
Version: 0.7.8
Closed Kinect V2
▼
倘若要获取 color Image、depth Image、infrared Image、bodyIndex Image、long Exposure Image 作为 PImage(Processing 中用于存储图像的数据类型),你可以用以下方法来激活之。
void enableColorImg(boolean toggle);
void enableDepthImg(boolean toggle);
void enableInfraredImg(boolean toggle);
void enableBodyTrackImg(boolean toggle);
void enableInfraredLongExposureImg(boolean toggle);
PImage getColorImage();
PImage getDepthImage();
PImage getInfraredImage();
PImage getBodyTrackImage();
PImage getInfraredLongExposureImage();
第一步,在 setup() 方法中初始化:
// 举个栗子
void setup() {
size(512, 424);
kinect = new KinectPV2(this);
kinect.enableDepthImg(true);
kinect.init();
}
第二步,在 draw() 方法中获取 PImage:
void draw() {
PImage imgD = kinect.getDepthImage();
image(imgD, 0, 0);
}
▼
Raw Data 仅适用于 color/depth/bodytrack frames/images。激活这些 frames/images 后,你只需调之即可。
//raw Data int valeus from [0 - 4500]
int [] rawData = kinect.getRawDepthData();
//values for [0 - 256] strip
int [] rawData256 = kinect.getRawDepth256Data();
//raw body data 0-6 users 255 nothing
int [] rawData = kinect.getRawBodyTrack();
//unpacket color values
int [] colorRaw = kinect.getRawColor();
Hello World(更多栗子):
该选用什么样子的源代码作为你的 Hello World 呢,我觉得重要的是你对之理解的通透程度。我选择 Test all Images:
/*
* Test all Images
*
* By Hewes
*
*/
import KinectPV2.*;
KinectPV2 kinect;
void setup() {
size(1536, 848);
kinect = new KinectPV2(this);
kinect.enableColorImg(true);
kinect.enableDepthImg(true);
kinect.enableInfraredImg(true);
kinect.enableInfraredLongExposureImg(true);
kinect.enableBodyTrackImg(true);
kinect.enableDepthMaskImg(true);
frameRate(60);
kinect.init();
}
void draw() {
background(0);
image(kinect.getColorImage(), 0, 424, 512, 424);
image(kinect.getDepthImage(), 0, 0, 512, 424);
image(kinect.getInfraredImage(), 512, 0, 512, 424);
image(kinect.getInfraredLongExposureImage(), 512, 424, 512, 424);
image(kinect.getBodyTrackImage(), 512*2, 0, 512, 424);
image(kinect.getDepthMaskImage(), 512*2, 424, 512, 424);
fill(255, 0, 0);
text(frameRate, 50, 50);
}
当六张图片都能准确显示时,那么证明你成功完成了基础学习。
一些有趣的灵感
我在《Kinect 应用开发实战》这本书上看到许多有趣的案例,不知道能否给予你些许思路:
尽管这些可能没帮上你,但通过后期的学习,相信你会有更好的创意诞生。
一些学习的资源
视频:
Kinect and Processing,By Daniel Shiffman;
Programming Kinect for Windows v2,By JeffKoch…(微软官方教学);
Kinect for Windows v2 开发,By Microsoft(中文字幕),笔者推荐;
Kinect for Windows 開發 – 邊做邊學,By 台灣微軟的資深講師「曹祖聖」;
Kinect for Windows Developer Blog,By Developers。
书籍:
《Making Things See》,By Greg Borenstein;
《Kinect 应用开发实战》,By 余涛;
《Beginning Kinect Programming with the Microsoft Kinect.SDK(2012)》
《KinectHIG.2.0》
所有书籍可在 Hewes 的 CSDN 下载 PDF 版学习。
网站:
官方文档
Microsoft Virtual Academy
Channel 9
博客:
Heresy’s Space
Kinect for Windows SDK v2.0 开发笔记,By dustpg
Kinect V2 C++开发,By bbdxf
Hewes 的编程艺术,By Hewes
一些闲扯的废话
接下来,我们做什么?
See you tomorrow。

浙公网安备 33010602011771号