一、体感交互
自从计算机被发明使用以来,从计算机出现在科研院校到进入千家万户,它与人的关系发生了翻天覆地的变化,人类利用各种方式与计算机进行信息的交互,从以手为主体的交互(从键盘到鼠标再到触摸屏),到使用人体各种动作进行交互,人机交互的方式逐渐多样化、立体化,各种交互方式在不同领域得到了良好的应用。如谷歌公司在2012年4月推出的谷歌眼镜,就是利用声音进行交互,声音可以控制拍照、视频通话和辨明方向,以及上网冲浪、处理文字信息和电子邮件。又如Kinect,它是微软公司开发的一款体感交互设备,能采集到一定空间范围内的二维彩色图像数据和三维深度图像数据,拥有四个声音采集装置,并能对人体的骨架进行自动分析。
在普适计算环境下,人机交互的性质也产生了一系列的变化。徐光祐等人认为普适计算使得信息空间与人们生活的物理空间相融合,与此相对应,人机交互也将随之扩展到人们生活工作的整个三维物理空间,因此,需要研究物理空间中的人机交互方式,在传统的计算模式下,交互环境的物理因素不影响人机交互,而在普适计算的模式下,用户和环境的物理因素将成为交互的重要因素,这将使人机交互的性质产生一系列的变化,其中包括人机交互本质上是与信息空间的交互,交互接口扩展到日常生活的用品和环境,动态的人机交互上下文相关等特点。[39]
庞小月等人认为人机体感交互是个体使用肢体动作直接与机器进行的交互,是新近发展起来的自然交互方式,人因学研究是体感交互研究中的核心问题之一,文章从体感交互的发展历史、已有体感交互方式、基于体感设备Kinect的人因学评估三个方面系统总结了体感交互已有的人因学研究,并对体感交互中存在的人因学问题与潜在研究方向作了论述。[40]
盛亚婷指出随着人类生活的智能化发展,各种体感交互技术不断涌现,其中通过自然手势进行体感交互的过程,符合人类日常交流习惯,在智能家电、虚拟现实等领域具有广阔的应用前景。但是,目前大部分手势识别技术由于种种原因难以推广应用。例如,算法复杂造成系统实时性差,或者对系统所处背景环境、用户衣着、坐姿等有限制。文章针对这些问题,提出了一种新的实时手势识别技术,可以适用于不同的复杂场景,其不受限于背景中出现类肤色物体或画面中出现用户手臂、面部,用户不需要佩戴手套之类的辅助道具。经过实验,文章算法在不同的复杂场景下表现出稳定的效果,手势识别率可达97.02%。文章最后设计并实现了一套基于手势控制的虚拟交互系统,该系统可以推广到智能电视、空调、手机等多种电子产品中,具有较高的应用价值。[41]
刘璐认为基于深度相机的体感交互具有设备简单、对环境要求低等优势,成为近年来研究的热点;文章的主要研究内容为动作预测、姿势估计和动作识别,把已有的动作分析方法分为基于学习的方法、基于样例的方法、基于模型的方法,基于模型的方法具有无须大规模样本存储和离线训练等优点,因此文章使用基于模型的方法进行用户骨架的提取,并对用户的节点轨迹进行实时的分析。[42]
吴清等人为了提高基于投影散斑的体感交互算法的精度和效率,提出采用零均值归一化互相关算子(ZNCC)恢复深度信息的快速计算方法,并通过引入特征筛选的分级决策树构建了姿态分类器。首先采用ZNCC在三维场景重建中求取散斑图像的视差,由三角化测量根据视差值反算目标场景的深度图像,基于GPU并行架构和改进的计算公式,解决ZNCC的冗余计算问题;其次采用改进的随机森林算法在姿态估计中完成人体部件分类,由mean shift算法实现关节点和骨骼提取,通过特征筛选机制去除无效特征降低训练数据的特征空间维度,并根据人体姿态动作的特点在决策树的组合中用分级决策思想提高预测精度;最后实现了系统的整体集成,通过实验验证了该方法的有效性。[43]
苏永刚等人将基于体感交互的控制方法引入骨折复位机器人,通过实验研究验证该方法的控制精度以及学习曲线,从而评估该方法的控制效果和学习的难易程度,利用Kinect采集操作者的手势以及手臂的运动状态作为控制参数,经计算机程序识别处理后生成机器人控制指令,从而控制机器人在模型骨上完成骨折复位操作,由6位操作者进行共计60次复位实验,得出复位精度和学习曲线数据,6位操作者的复位平均距离误差为(4.10±0.77)mm,角度误差为3.25°±1.11°;通过学习曲线分析发现,从第6次实验开始,操作所用时间显著缩短,将基于体感交互用的控制方法用于骨折复位机器人控制,不仅能够满足复位精度要求,而且操作学习时间短。该方法可为手术机器人的人机交互提供一种新的有效方法。[44]
二、交互音乐
交互音乐又叫交互式音乐(interactive music),最早是由法国国立音乐音响研究所(IRCAM)的音乐家们提出的电子音乐新概念。交互音乐一般是指在音乐现场演奏中,在已有的音乐素材基础上进行临时即兴创作的过程,它利用人与计算机或各类带传感器的乐器或音频音箱设备的交互,达到丰富和改变音响效果的目的。
比较有名的交互音乐作品有美国人约翰·凯奇的《想象中的风景》(1952)、德国施托克豪森的《麦克风》(1964)和《独奏》(1966)、法国皮埃尔·布列兹的《二重影子的对话》(1984)、意大利威尼斯作曲家路易基·诺诺的《波兰日记第2号》(1982)、美国音乐家杰弗瑞·斯托莱特的《东京速度》(2001)、中国刘健的《半坡的月圆之夜》(2003)等。
早在2005年就有国内学者关注交互音乐。潘祖君认为随着20世纪科学技术发展的日新月异及其向人类社会当代文明各个领域的浸透,一些作曲家走向了音乐与高科技相互结合的道路,寻求一种更加符合他们音乐音响观念和音乐审美情趣的交互方式,这促使作曲家与科技专家相互协作,共同完成音乐作品的创作。[45]
班文林通过考察交互式音乐的起源和历史,明确交互音乐与现场电子音乐的关系及与交互式装置的区别,并且分析交互式音乐的本质特征和表象特征,指出交互音乐必须满足四个要素,即真实乐器输入、实时电子性处理、实时声场控制、演出中的偶然性,并对交互音乐与中国传统音乐的融合提了期望。[46]
班建东指出随着科技的日新月异,电子音乐技术不断地被运用到实际音乐创作中,极大地丰富和拓展了原有的音乐类型和表演形式,尤其是电子音乐技术在与声学乐器结合、扩展方面,有着不容忽视的作用。电子音乐可以在音域、音色、声场等方面对声学乐器进行扩展,弥补传统声学乐器的不足,从而使声学乐器的表现方式由单一向多元转变。[47]
不少研究人员对不断涌现的交互音乐作品进行了音乐理论分析,杜啸虎针对《绳索的仪式》这部作品,将数据驱动控制器与音乐相结合,将时下流行的新媒体互动艺术与现代电子音乐相结合,在传统作曲技术和电子音乐技术理念之间找到契合点,在乐音和噪音之间找到平衡,将新媒体互动艺术的科技性与电子音乐的音乐性融为一体,充分体现了作曲家在电子音乐创作上的多元化融合理念。[48]李鹏云针对《奉献—为大提琴和Max/MSP而作的帕萨卡里亚》进行了分析,它是作曲家刘健于2009年在上海音乐学院国际电子音乐周之委约而创作的一部交互式电子音乐作品,采用传统音乐中的帕萨卡利亚形式,以巴赫《音乐奉献》的主题为低音主题,通过19次变奏,并借助了MAX/MSP平台及声音处理软件,使古老的帕萨卡里亚获得新的内涵,体现了作曲家在交互式电子音乐创作中“传统与现代融合”“电子与声学交互”的创作思维,并展现了作曲家在交互及电子音乐处理中的综合技术。[49]
在其他一些注重用户体验的交互音乐创作中,单湉艺指出现代音乐制作技术不断成熟,创作思想和创作手法日益趋于多元化,为现代音乐发展提供了良好的基础;更多爱好音乐者更喜欢把自己的音乐灵感如同绘画一样,泼墨在一张白纸上,并不拘泥于某种音乐形式、方法、理论、平台,而是用代码的方式,更加灵活地通过音乐这种载体形式将自己的想法呈现出来。[50]景宇阳认为Leap motion是一款红外线体感控制设备,它可以选择是否识别生物体,例如,人手和手部模型,这个功能可以巧妙地利用,例如,在手上拿一支铅笔,就可以模拟小提琴演奏家拿着弓子,更好地模仿演奏家的演奏,这款控制器可以运用在游戏、教育、医疗、互联网、人工智能等领域,用途十分宽广,Leap motion为音乐的创作提供了无限的可能。[51]
交互音乐也被应用在一些特殊场景中,王槐欣研究了利用常见的笔作为交互工具,来影响音乐喷泉的音响效果。他认为笔是一种交互设备,是一种自然、高效的交互方式;从计算机技术的角度来看,笔交互的软硬件技术已经相当成熟,各种各样的笔交互设备琳琅满目,因此提出了一种利用笔交互设备实时控制水流运动的设计方法,突破了以往从音乐分析和理解出发,然后才能编码的局限,并设计了一种被命名为ToolCursor的快速就地工具切换技术,它不仅可以被笔交互工具来操纵,而且可以被普通的鼠标所控制,通过对用户实验数据的分析,证实其相比普通的ToolBar在性能上有大约26.4%的提升,文章还充分利用了笔交互设备的三维空间信息,给出了一种针对TiltMenu的改进方案,大大提高了交互舒适性;由于音乐喷泉的粒子数量可以达到百万级别,传统的粒子系统方法几乎不可能实现对如此海量粒子的实时运动计算与绘制,文章提出一种大规模音乐喷泉的实时模拟方法,借助音乐数据建立音乐喷泉的粒子运动模型,通过充分挖掘图形处理器强大的并行处理能力,突破了海量粒子系统实时运动计算及实时绘制的瓶颈,并且针对喷泉水滴的特点,改进了绘制方法,成功地实现了对大规模音乐喷泉的实时模拟。[52]
三、Kinect简介
Kinect是2010年6月微软公司开发的一款体感交互设备,如图2-7所示,它能采集到一定空间范围内的二维彩色图像数据和三维深度图像数据,拥有四个声音采集装置,不需要使用任何控制器,依靠相机捕捉三维空间中玩家的运动,从而实现即时动态捕捉、影像辨识、麦克风输入、语音辨识、社群互动等功能,并能对人体的骨架进行自动分析,是理想的动作捕捉与骨架分析工具。但Kinect适合身体旋转动作少或没有的场合,如体感游戏等,对于运动中出现有大量的旋转动作的交互操作,需要利用多台Kinect设备或其他方法进行动作捕获和骨架分析。
图2-7 微软公司出品的Kinect体感交互设备
一年后,微软公司推出了Kinect for Windows SDK Beta,后来又推出了Kinect for Windows SDK正式版,Kinect for Windows SDK为程序开发人员开启了无限宽广的世界,可以轻松在Windows上发挥Kinect的技术潜力,并创造出更自然、更具直觉性的计算机操作体验。Kinect for Windows SDK包含了众多来自微软研究院的创新技术,开发人员可对自然用户接口进行创造性探索,感受到它所带来的无限可能。Kinect for Windows SDK也拓展了Kinect丰富的可能性,可应用于社会的各个领域。Kinect for Windows SDK主要是针对Windows7设计,内含驱动程序、丰富的原始感测数据流程式开发接口(RawSensorStreamsAPI)、自然用户接口、安装文件以及参考数据。Kinect for Windows SDK可让使用C++、C#或VisualBasic语言搭配Microsoft Visual Studio 2010工具的程序设计师轻易开发使用。
Kinect for Windows SDK的主要特色包括:
(1)原始感测数据流:开发人员能够直接取得距离传感器、彩色摄影机以及四单元麦克风数组的原始数据流。这些数据让开发人员利用Kinect传感器的低阶数据流为基础进行应用程序开发。
(2)骨架追踪:此套SDK能够追踪Kinect视野内一位或二位用户的骨架影像,便于建立以体感操作的应用程序。
(3)先进的音效功能:包括抑制噪音与回音消除功能、可透过音波形式辨识声音来源,并且能与Windows语音识别API整合。
(4)简易的安装:这套SDK提供了在Windows7上的标准化安装方式,无须复杂的组态设定,安装文件大小也不到100MB。开发人员只需购买标准的Kinect传感器,就能在几分钟内立即开发。
(5)完整的说明文件:SDK也随附详细的高质量技术文件。除了内建的说明文件之外,还包括了多个范例详细的逐步分解说明。
有关基于Kinect技术的研究成果层出不穷,在中国著名的科研信息网—万方数据中,输入关键词Kinect,截至2017年10月6日可搜索到1221篇相关研究成果。周瑾等人指出三维人体模型广泛应用在多媒体工业,如动漫产业、游戏创作、电影制作等,针对传统三维扫描仪价格昂贵、操作复杂等缺点,提出一种基于低廉的深度摄像机(如微软Kinect)重建三维人体模型,该方法使用迭代最近点查找确定输入点云与可变模型之间的对应点对,将可变形人体模型拟合扫描点云数据,迭代生成高精度的三维人体模型,实验结果表明,文中方法能够使用Kinect深度摄像机快速重建出高精度的三维人体模型。[53]李诗锐等人指出快速、低成本、精确的三维扫描技术一直是计算机视觉领域研究的热点,文章先分析了新一代Kinect v2(Kinect for Windows v2 sensor)的技术参数、测量原理,设计实验测得其深度精度与测量距离呈线性变换关系;其次,Kinect v2深度数据含有大量的噪声,尤其是在物体边缘,常用的双边滤波器等去噪算法不能很好地去除这些噪声,对此设计了一种有效的去噪算法,以提高重建质量;最后,实现了一套基于新一代Kinect v2的重建系统。实验结果表明,该重建系统能够实时、精确地重建物体,可以广泛应用于低成本的快速三维成型。[54]
在Kinect的相关研究成果中,手势识别是主要研究内容之一,晏浩等人针对现有手指跟踪算法的不足,利用微软Kinect设备提出一种实时鲁棒的三维多手指跟踪算法,先利用深度图分割出一个粗糙的手区域,对该区域应用基于像素分类的指尖检测算法得到二维指尖点的位置,然后在深度图像上对二维指尖位置周围的点进行采样,将均值作为指尖点的Z坐标,再利用卡尔曼滤波器以及帧之间的连续性对指尖点的三维位置进行跟踪,依据Kinect数据特点提出的二维指尖检测算法和利用帧之间连续性的卡尔曼滤波器是文中算法的关键,实验结果证明,该算法能够实时、稳定地进行三维多手指跟踪。[55]张毅等人为实现基于Kinect深度图像信息的手势轨迹识别,提出了一种基于隐马尔可夫模型(HMM)的手势轨迹识别的方法,首先采用新型Kinect传感器获取图像深度信息,然后通过OpenNI的手部分析模块获得手心的位置,提取轨迹特征,最后利用隐马尔可夫模型训练有效的轨迹样本并实现轨迹的识别,实验结果证明,该方法能有效地识别手势轨迹,并可用于控制智能轮椅的运动。[56]
Kinect的应用研究,特别是在医学领域得到了良好应用。杜惠斌等人认为以Kinect为代表的深度图像传感器在肢体康复系统中得到广泛应用,单一深度图像传感器采集人体关节点数据时由于肢体遮挡、传感器数据错误和丢失等原因降低系统可靠性,文章研究了利用两台Kinect深度图像传感器进行数据融合从而达到消除遮挡、数据错误和丢失的目的,提高康复系统中数据的稳定性和可靠性,先利用两台Kinect采集患者健康侧手臂运动数据,其次对两组数据做时间对准、Bursa线性模型下的坐标变换和基于集员滤波的数据融合,再次将融合后的健康侧手臂运动数据经过“镜像运动”作为患者患侧手臂运动指令,最后将患者患侧运动指令下发给可穿戴式镜像康复外骨骼带动患者患侧手臂完成三维动画提示的康复动作,达到患者主动可控康复的目的,通过Kinect与VICON系统联合实验以及7自由度机械臂控制实验验证了数据融合方法的有效性,以及两台Kinect可有效解决上述问题。[57]
Kinect也被应用在音乐教学中,田梅等人针对目前音乐专业学生钢琴即兴伴奏应用能力较低的现状,提出一种结合MIDI键盘与Kinect深度传感器的方法来达到识别和弦进行与判断学生演奏时指法的目的,并实现该辅助教学系统;先获取彩色和深度图像的信息,构建和弦转位的状态转移图和和弦手势模板库,作为系统初始化条件;其次利用传统的肤色建模和背景差分方法以及现在的深度数据,综合手势的表观特征,通过模板匹配实现手势识别;最后判断和弦进行的正确性,并综合指法应用进行打分与评价;实验结果表明,该系统具有较高的鲁棒性,能够有效地应用于钢琴教学。[58]
四、基于Kinect的人体关节运动获取音乐数据
交互音乐是以预置的音乐素材为基础,在现场演奏的时间轴上加入随机因素,实时产生新的音响效果的音乐形式。交互音乐中的随机因素来源广泛,可以是DJ用的打碟机,带感应器的电器设备,或者是计算机随机产生的数据,也可以是从环境中获取的实时数据等。
利用Kinect可以实时获取近处人体活动的动作和图像数据,这些数据可以成为交互音乐中随机因素的数据源,甚至可以直接现场作曲,如图2-8所示是腾讯视频[59]中一段3分34秒视频的一个截图。
图2-8 The V Motion Project
此视频由Jeff Nusz和Paul Sanderson开发,Joel Little和Ableton编曲,Josh Cesan现场舞蹈的交互音乐作品The V Motion Project结合了视觉光影、音乐、舞蹈、电脑程序、艺术设计和动画等多媒体技术,舞者通过Kinect用他的手和身体来操纵Skrillex风格的dubstep音乐,完成一个令人蹚目结舌的表演。
利用Kinect可以实时获取前方一定范围内的图像数据、三维深度数据和声音数据,并能跟踪人体的关节移动信息,这为基于Kinect的开发提供了广阔的应用场景。开发者借助Kinect SDK提供的彩色图像视频流、深度图像视频流、骨骼跟踪、音频处理和语音识别的API,设计开发满足自己场景的功能,实现特定场景应用。
下面对Kinect for Windows SDK v1.5提供的API进行分析,此版本的SDK的特点包括:多线程/多核支持,支持设备断开接入,支持64位应用程序,支持4个Kinect接入同一台电脑,指定用户跟踪骨骼,支持10个关节点跟踪模式,允许记录回放原始数据流,彩色图像流和深度数据流同步,改进了“far-talk”声音模式,丰富的示例代码等,当然SDK v1.5还没有提供的API包括没有提供姿势识别和动作识别的API,没有提供手指跟踪的API,没有提供手势识别的API,没有提供人脸识别的API,没有提供数据流的持久化记录和回放API,只有垂直±280仰角控制等。下面利用图2-9来描述Kinect for Windows SDK v1.5提供的API之间的关系。
图2-9 Kinect for Windows SDK v1.5的API堆栈结构[60]
Kinect SDK的核心NUI API包括图像数据流、深度数据流、音频数据流、骨骼跟踪以及语言识别等相关API,虽然尚未提供手指跟踪、手势识别、姿势动作识别、人脸识别等热门功能,但根据图2-9的API堆栈结构,可以针对不同的应用场景实现这些功能。
在音乐艺术领域,手指跟踪、手势识别、姿势动作识别和人脸识别都有相对应的应用场景,下面分别讨论:
(1)手指跟踪:在音乐演奏中,手指往往是实现完成乐器旋律的主要肢体部件,绝大多数乐器的演奏需要手指参与,许多乐器的演奏只使用手指,如钢琴、小提琴等;在一些虚拟乐器演奏中,手指跟踪需要实时返回手指的动作信息,如左右手、手指序号、手指力度等信息,根据这些信息回放相应的音响效果。
(2)手势识别:在音乐演奏和演出中,手势识别也占有许多应用场景,如乐队指挥在演出中,基本的动作是以手臂动作为主,脸部表情次之,其他动作为辅;如架子鼓、钹、锣等打击乐器的演奏,基本的演奏动作由手臂完成,由于Kinect能较好地完成上半身的骨骼跟踪,所以基于Kinect的打击乐器或乐队指挥的手势跟踪识别应该具有较好的实际效果。
(3)姿势动作识别:姿势动作一般是指全身骨骼动作的跟踪和识别,在音乐表演中,需要全身骨骼动作跟踪的比较少,主要包括舞蹈动作跟踪,但是舞蹈动作在三维空间中的变化多样,包括各种平移、旋转、跳跃等动作,而Kinect对旋转动作是无法跟踪的,所以可以采用多台Kinect多方位同步跟踪的方式,再融合各个数据源来完成数据采集。
(4)人脸识别:人脸识别有非常广泛的应用场景,如2017年开始出现的刷脸支付实验,就是以人脸识别为基础的技术应用,在音乐场景中,人脸识别可以对演奏者的表情变化进行跟踪,并进行情绪分析。
(5)声音识别:声音识别通常指语音识别,就是说话声中的语言语义识别,简单说就是把说话变成文字,Kinect SDK提供了英语的语言识别功能,对于中文等语种的语音没有文字识别功能;在音乐场景中,歌声的歌词发音方法和语音的发音方法不同,而且歌声音频往往和伴奏音频混在一起,这种情况下的声音识别具有极高的挑战性。
在后面的章节中,我们将讨论利用手势识别功能进行作曲的方式方法,在这交互式作曲过程中,手势识别所获得的实时数据是基础性工作,下面将详细讨论利用Kinect来实时获取骨骼关节数据的实现方法。
图2-10 Kinect骨骼跟踪20个关节点
骨骼跟踪是Kinect NUI API中重要的部分,在Kinect NUI API初始化时,通过设定“骨骼跟踪”选项,可以最多同时“骨骼跟踪”2个用户,获得每个用户20个骨骼关节点的三维坐标信息,这20个关节点的位置如图2-10所示,它们的英文与中文对应说明如下:Head(头),ShoulderCenter(双肩中间),ShoulderLeft(左肩),ShoulderRight(右肩),ElbowLeft(左肘),ElbowRight(右肘),WristLeft(左腕),WristRight(右腕),HandLeft(左手),HandRight(右手),Spine(脊椎),HipCenter(臀部中间),HipLeft(臀部左边),HipRight(臀部右边),KneeLeft(左膝盖),KneeRight(右膝盖),AnkleLeft(左髁),AnkleRight(右髁),FootLeft(左脚),FootRight(右脚)。
当启动Kinect设备后,在Kinect的视野范围内,Kinect骨骼跟踪引擎提供最多2名用户的骨骼跟踪信息,当启动主动跟踪选项时,可以通过调用相关API获得完整的下一组骨骼帧数据,如果启动被动跟踪选项,可以提供4个用户的位置信息,缺省情况下,最先被捕获的2个用户被启动主动跟踪。骨骼跟踪引擎会在设备启动后返回一组骨骼数据,应用程序需实时获得数据并进行后续处理。Kinect的每个被跟踪的用户将返回如下信息:①当前骨骼跟踪的状态(主动/被动),对应的值分别为“position-only tracking”和“skeleton-tracked”;②骨骼数据(主动跟踪)或位置数据(被动跟踪)。
在启动Kinect设备后,缺省情况下会对视野内的所有活动用户进行跟踪,但只跟踪前两个用户的骨骼数据,其他用户跟踪位置数据,如果需要改变每个用户的跟踪状态,则需要设置变量“AppChoosesSkeletons”为“true”,同时调用ChooseSkeletons方法,让设备对用户进行重新跟踪。
骨骼空间坐标是三维的,以米为单位,三维坐标中X、Y、Z坐标轴分别表示面对用户的Kinect设备的左右方向(左方向为正轴,右方向为负轴)、上下方向(上方向为正轴,下方向为负轴)和前方方向(前方就是正轴),如果设备放置在非水平的地方,Y轴将会是非垂直的。骨骼数据结构如下:(www.xing528.com)
其中,eTrackingState表明当前人体追踪状态,dwTrackingID是人体识别的ID,成员变量NUI_SKELETON_POSITION_COUNT为人体骨骼数量,Position明确某骨骼节点位置,SkeletonPositions中存放骨骼节点的三维坐标。
首先,准备实验环境。实验环境的设置主要包括以下三点:
(1)准备设备:实验用的PC机的硬件是联想笔记本电脑,内核是Intel CoreTMDuo CPU P8400 2.26GHz, RAM内存2.00GB,软件系统环境是Windows 7 Service Park 1旗舰版,32位操作系统;Kinect应用程序需要在原生操作系统环境下编译、运行,它无法在虚拟机上运行也无法在虚拟机上安装;同时更新Windows系统。
(2)安装开发环境:这里利用Visual Studio Community 2017综合开发环境,它是一款可供各个开发者、开放源代码项目、学术研究、教育和小型专业团队免费使用的产品,集中了C#、Visual Basic、F#、C++、HTML、JavaScript、Python等不同的程序设计语言,可以从事通用Windows平台开发、.NET桌面开发、ASP.NET和WEB开发、Azure开发、Python开发、Node.js开发、数据存储和处理、数据科学和分析应用开发、Office/SharePoint开发、.NET移动开发、Unity游戏开发、JS移动开发、Linux开发、.NET Core跨平台开发等,它可以从微软公司的网站(www.visualstudio.com)免费下载。在安装的时候,安装程序会检查.NET Framework版本,Visual Studio Community 2017要求.NET Framework4.6或更高版本,如果版本低于要求,会先要求并引导下载安装最新的.NET Framework,或者要求先对Windows进行更新。可以选择安装自己需要的开发环境,这里选择安装C++,VB这两个程序开发语言。
(3)安装Kinect驱动程序和SDK开发包:安装前删除原有的Kinect驱动或第三方的驱动程序,然后从developer.microsoft.com/zh-cn/windows/kinect下载最新的Kinect驱动程序和SDK开发包,目前(2017年10月)的最新版是SDK2.0,支持的语言只有英语,在下载的过程中,会要求你更新相应信息,按它提示要求完成每一步;在安装Kinect驱动程序时,先安装Kinect SDK,再安装Kinect Developer Toolkit开发工具包。
运行测试,将Kinect传感器接上外部电源,把数据传输线接到电脑的USB口,然后在Windows“开始”菜单的搜索框中输入关键词“Kinect”,计算机自动把和“Kinect”相关的项目列表出来,选择并单击搜索结果中的“Developer Tookit Browser v1.6.0(Kinect for Windows)”,界面如图2-11所示。
在图2-11中选择“Kinect Explorer”选项,可以看到在屏幕上出现一个窗体,窗体从左到右包含两个小窗口,分别是彩色视频窗口和深度数据图示窗口,每个窗口下有相应的参数可以设置,窗口的内容是Kinect设备前方环境的彩色视频和深度图,如图2-13所示是Kinect获取的前方环境的深度数据图,在图2-12中,离Kinect设备近的物体偏白色,离设备远的物体为深色或黑色,距离相同的为同色,这时,Kinect设备前方环境的变化会及时反映在两个窗口里;在启动“Kinect Explorer”选项的基础上,再启动“Kinect Studio”选项,录制“Kinect Explorer”的视频和深度数据,如在“Kinect Studio”各类缺省设置情况下,录制30秒的数据,占用的存储空间大于650M,如图2-13所示,如果不录制彩色数据,30秒视频的数据量也达到了近320M,可见数据量是非常可观的。
图2-11 Kinect资源与例举列表
图2-12 Kinect获取书房一角的深度数据图
其次,设计获取深度数据程序:下面先通过Visual Studio Community 2017设计获取并显示Kinect深度数据的程序,具体步骤如下:
(1)运行Microsoft Visual Studio 2017。
(2)点击菜单栏的“文件”→“新建”→“项目”,在弹出的“新建项目”窗口中选择“Visual C#”,然后在右边的“.NET Framework 4.6.1”列表中,选择“控制台应用(.NET Framework)”,并在名称输入框中输入“ShowDepthData”,选择保存的目录,点击“确定”;这时,整个窗口出现上下左右四个小窗口,左上窗口是代码编辑区,左下窗口是显示输出信息,右上窗口是解决方案资源管理器,右下窗口是属性。
图2-13 “Kinect Studio”菜单项录制“Kinect Explorer”选项30秒左右的数据量
(3)在右上窗口中找到“引用”,并右键点击,在弹出窗口中选择“添加引用”,弹出一个“引用管理器”窗口,在窗口的右上角输入“Kinect“,在中间列表中出现“Microsoft.Kinect”,选中它,点击“确定”,这时在Microsoft Visual Studio 2017的屏幕的右上窗口的“解决方案资源管理器”的“引用”中出现了“Microsoft.Kinect”引用选项。
(4)在左上窗口的代码编辑区内,找到“using…….”的代码行,在最后一个“using……”代码行下面添加一行“using Microsoft.Kinect”。
(5)最后在左上窗口的代码编辑区中,添加如下C#代码,见附录【代码2-10】,其中黑色代码行是新添加的代码行,其他为Microsoft Visual Studio缺省代码。
运行结果如图2-14所示,起初在控制台窗口显示二行,第一行显示“First running……”,第二行显示“1”,就是连接到计算机的Kinect设备的数量,等待1秒左右,程序获取到Kinect设备传来的数据,就开始滚动显示深度数据信息。
再次,设计获取骨骼关节空间运动三维数据程序:下面通过实验来设计利用Kinect获取骨骼关节的空间运动三维数据,并保存到指定格式的一个文本文件中。实验步骤如下:
(1)运行Microsoft Visual Studio 2017。
(2)点击菜单栏的“文件”→“新建”→“项目”,在弹出的“新建项目”窗口中选择“Visual C#”,然后在右边的“.NET Framework 4.6.1”列表中,选择“WPF(.NET Framework)”,并在名称输入框中输入“getSkeletonData”,选择保存的目录,点击“确定”。
图2-14 Kinect获取的深度数据滚动显示窗口
(3)在右上窗口中找到“引用”,右键点击“引用”,在弹出窗口中选择“添加引用”,弹出一个“引用管理器”窗口,在窗口的右上角输入“Kinect”,在中间列表中出现“Microsoft.Kinect”,选中它,点击“确定”,这时在Microsoft Visual Studio 2017屏幕右上窗口“解决方案资源管理器”的“引用”中出现了“Microsoft.Kinect”引用选项。
(4)在左上窗口的“MainWindow.xaml.cs”代码编辑区内,找到“using…….”的代码行,在最后一个“using……”代码行下面添加一行“using Microsoft.Kinect;”,利用此引用可以调用Kinect相关函数和实体;在后面再添加一行“using System.IO;”,利用此引用可以调用文本文件读写的相关函数功能。
(5)在右上窗口中找到“MainWindow.xaml”并双击,这时在编辑屏幕的左边中间出现了代码,在<Grid>和</Grid>之间增加如下代码(黑体):
这些代码可以在“MainWindow”主窗体上增加两个按钮。
点击按钮后的处理代码,见附录【代码2-11】。
然后添加按钮的对应的功能,按钮的功能分别是开启Kinect设备和记录关节运动数据、关闭Kinect设备,见附录【代码2-12】。
(6)接着是关闭Kinect设备的函数,见附录【代码2-13】。
(7)在启动Kinect设备后,需要在内存中存储获取后的关节数据的实体,这样,在“public MainWindow()”语句上面加一条语句,定义一个全局变量,语句为“public static Skeleton[]mySkeletonArray;”。
(8)开启Kinect设备并持续获取关节数据,见附录【代码2-14】。
上述代码里骨骼关节跟踪处理的示例代码,见附录【代码2-15】。
上述代码只是获取的三维空间运动数据变化,其他关节点可以添加,只要修改语句“currentSkleton.Joints[JointType.HandRight].Position.Y.ToString()”中的“HandRight”为其他关节的成员名称即可,其他成员名称见表2-1。
综合利用此实验多个函数的C#代码,把Kinect设备用USB连接到计算机,运行此实验的C#代码,编译后点击“Start and Recode”按钮,在设备前用右手进行空间三维运动,模拟音乐乐队指挥的动作,几秒钟后点击“Close”按钮结束数据获取,在相应目录打开“SkeletonData.txt”文件,可以得到图2-14的右手运动三维数据,如图2-15所示,每行用逗号分割为4列数据,分别是时间、X轴、Y轴、Z轴数据,观察发现,在1秒内,Kinect一共获取了30个右手的三维运动位置数据。
最后,分析音乐乐队指挥右手空间三维运动数据。
利用上述(3)的程序,在Kinect设备前模拟音乐乐队指挥的打拍动作,指挥启动Kinect设备后,站立在Kinect设备前约1米处,设备放置高度与指挥的肩膀同高,并开始打节拍,设备接受前方环境数据,当成功跟踪上指挥的骨骼后,指挥连续打了2/4拍的节拍60拍,然后指挥坐下关闭Kinect设备,共用时66秒,记录了1871个记录的数据量。
表2-1 Kinect中JointType Enumeration各关节成员名称
图2-15 Kinect设备前的右手空间运动三维数据
指挥在乐队演奏指挥中,如果是2/4拍的乐曲,基本的指挥动作是左右手提到胸口前位置,按“∞”形从内到两侧连续运动,双手对称运动,完成2/4拍乐曲的打拍。指挥除了左右双手运动外,身体其他部位基本不运动,同时,左右手运动带动了整个手臂的运动,所以手部运动是关键。由于双手打拍时基本动作在多数情况下是对称的,所以这里只记录了右手的三维运动数据。
Kinect设备获取指挥的空间三维运动数据,它的三维数据轴以Kinect设备为中心,左右方向是三维运动数据的X轴,其中右边方向是X轴的正数轴;上下方向是三维运动数据的Y轴,其中上方方向是Y轴的正数轴;前后方向是三维运动数据的Z轴,其中前方向是Z轴的正数轴。显然,指挥在Kinect设备前方,所以它的Z轴的运动数据都是正数;Kinect设备与指挥的肩膀同高,这样它的Y轴的运动数据绝大部分是负数;由于指挥正面对着Kinect设备,而且身体基本保持不动,因此获取的右手运动轨迹一直处于它的X轴的同一侧,在这里所获取的X轴数据大多是正数。
利用Matlab工具对获取的指挥右手运动数据进行分析,由上述(3)获得的数据存放在“SkeletonData.txt”文件中,对文件中的数据进行可视化分析,具体Matlab代码见附录【代码2-16】。
通过上述代码得到图2-16~图2-19,如图2-16~图2-18所示,指挥的动作在X、Y、Z三个数轴上都是很有规律地变化,由于右手运动是按“∞”字形运动,所以在X轴上指挥打拍的相邻两拍的数据变化更加明显。
如图2-19所示,散点是Kinect获取的离散的各个动作的X、Y、Z轴的数据点,图的坐标是按Kinect的视角显示的,观察图可知,所有散点按左下到右上方向分布,这是因为手臂在按“∞”字形运动时,在外侧时右手会比在内侧时高一点,同时,“∞”字形动作交叉部分的散点比较集中。
我们继续利用上述数据,对X、Y、Z轴数据进行统计,如图2-20所示是各数轴上数据的直方图统计结果,具体代码如下:
图2-16 指挥连续打拍动作的X轴数据变化曲线
图2-17 指挥连续打拍动作的Y轴数据变化曲线
图2-18 指挥连续打拍动作的Z轴数据变化曲线
图2-19 指挥连续打拍动作的X、Y、Z轴数据散点图
如图2-20所示,X、Y、Z轴中,各个动作的数据相对比较集中,如X轴集中在0.2米左右,说明指挥的右手在Kinect设备的X轴距离0.2米处出现次数较多,Y轴数据集中在-0.3米处,Z轴数据集中在1米处。
通过对获取的1871个运动数据进行统计,可以得到表2-2,X轴上97.32%的数据为正数,Y轴上99.15%的数据为负数,Z轴上所有数据都为正数,X轴上数据绝对值最大的数据是正数,Y轴上数据绝对值最大的数据是负数,Z轴上所有数据的均值为0.9573米,正是指挥与Kinect的平均距离。
图2-20 X、Y、Z轴上运动数据的直方图
表2-2 Kinect获取指挥右手运动三维空间数据统计
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。