基于Kinect的唐卡图像交互设计与实现

马玉娟,刘晓静

(青海大学 计算机技术与应用系,青海 西宁 810016)

唐卡历史悠久,是中国藏族优秀传统文化的一种绘画艺术形式,其内容保罗万象,包括西藏的文学艺术、藏医藏药等,展示了西藏地区的政治经济和人文环境,是人们了解西藏的有效途径,被誉为“西藏的百科全书”。近年来,体感技术得到迅速发展。微软的Kinect体感设备能够实时捕捉人体动作、声音等一系列信息,因其价格低廉、实用性强等特性深受研究者们的青睐,很多国内外研究人员都选择在此平台上进行开发和研究。2012年,Zhang详细介绍了Kinect传感器及其应用效果;
2015年,Péter Fankhauser等评估了Kinect v2深度传感器在移动机器人导航中的应用。目前,林玲等建立了轨迹特征融合双流模型对动态手势进行识别;
Feyziolu等将基于Xbox 360 Kinect的虚拟现实训练应用到乳腺癌手术患者中,起到了比标准物理疗法更好的治疗效果;
Assad-Uz-Zaman等开发了基于Kinect控制的NAO远程康复机器人,成功进行遥控操作,指导和演示患者实时执行不同的手臂运动锻炼。

经过多年的研究与开发,课题组已将Kinect体感技术应用于计算机、医疗、教育等各大领域,但在弘扬唐卡文化方面还未普及,如何以创新的思维方式将现代科技与传统文化相结合,让更多非藏族群众了解这门艺术,并把唐卡文化发展为当代受欢迎的艺术形式,让更多人感受到藏族人民的时代精神,是一个重大的研究课题。相较于体感技术在其他领域的应用发展,文中结合Kinect传感器讨论了体感交互在唐卡文化中的应用,通过手势控制的体感交互方式实现堆绣唐卡的堆绣操作,利用Kinect采集用户深度数据、彩色数据等,根据Kinect SDK等中间插件进行人体识别、手势识别,利用手势交互的方式完成堆绣操作,以扫描动态二维码的方式保存堆绣成品到个人移动设备中。

1.1 需求分析

随着时代的发展,热爱唐卡的人不再局限于藏传佛教僧侣和信徒,它成为了一件艺术品,甚至工艺品,被大众推广,出现在了众多博物馆、展厅、商店以及艺术爱好者的手中。随着唐卡爱好者不断增多,其传承方式也应随之创新。单纯的传承和复制传统唐卡技艺,只会让唐卡艺术发展停滞不前。结合现代科技,繁荣唐卡文化,才能使其可持续发展。通过手势体感交互、二维码交互的方式了解、传播唐卡文化,其代入感更加明确,体验度大大增加,能够让用户以放松的心态、娱乐的方式认识唐卡文化,体验唐卡文化的博大精深,具有较好的现实意义与推广性。

1.2 总体设计

本研究以Kinect体感设备为数据输入源,以Unity3D为开发工具,通过Kinect v2 Examples with MS-SDK中间插件来完成Kinect与Unity3D两者间的连接。依据ZXing包生成并解析二维码,利用UI界面截图方式将手势实现的堆绣作品上传到服务器,并对返回的Json字符串进行处理,得到的图片链接后赋予二维码,通过扫描二维码的方式保存在个人移动设备中。系统框图如图1所示。

系统架构主要分为四部分:手势堆绣、UI界面、二维码实现以及判断是否完成堆绣。

(1)UI界面。

UI界面主要分为三部分,选择界面、堆绣界面和二维码面板。本项目涉及到四幅堆绣唐卡图,可以在选择界面选择自己喜欢的唐卡图进行堆绣。堆绣界面是实现堆绣功能的主界面,由四个堆绣界面组成,这四个界面除了堆绣图以及元素不同,其他都保持一致。

图1 系统架构

(2)手势堆绣。

手势堆绣需要通过Kinect SDK将Kinect传感器与PC相连接,采集用户数据,利用Kinect SDK平台进行人体骨骼识别。在识别人体骨骼框架的基础上进行手势识别,识别到的手势数据在PC端匹配,根据所匹配手势动作的不同,分别实现手势堆绣的不同操作。为了让用户的体验不受设备影响,本项目在实现手势堆绣的同时,也实现了鼠标堆绣。该文将重点介绍手势堆绣的实现。

(3)二维码实现。

二维码实现分为三个步骤,待堆绣完成,首先将堆绣好的唐卡图进行屏幕的区域性截图,并保存在本地,然后将保存到本地的截图上传到服务器,再根据返回的Json字符串将图片信息赋值给生成的二维码,完成扫码存图的功能。

(4)判断是否完成堆绣。

堆绣面板中灰色元素代表待放置元素的线框,在堆绣元素拖动过程中,通过位置判定的方式判断是否放置正确。如果所拖动的堆绣元素放置到对应元素线框中,则该线框Bool值为True,否则为False。通过对元素框Bool值的判定以及完成按钮是否被点击的判定,判断是否完成堆绣操作。判定为完成则弹出二维码面板,否则返回界面,进行后续操作。

2.1 UI界面

UI的设计与实现通过Unity3D软件完成,利用C#脚本进行控制。堆绣UI界面中的背景、堆绣主面板、堆绣元素面板均通过添加Image或Raw Image组件并为其Texture属性赋值实现。将堆绣元素经Photoshop黑白图层处理,得到灰色元素线框。用Image组件将各个元素线框放置于对应原图像所在位置,遮盖原位的彩色图像,实现元素线框的展示。堆绣元素面板中的每一个元素实际都是一个按钮,在UI界面中添加十个Button物体,并在其Source Image组件中分别赋值元素图片,即可完成元素的显示。堆绣界面如图2所示。

图2 堆绣界面

选择UI的实现方式类同于上述堆绣UI的实现方式,不同之处在于四个选择按钮的Image是动态的,选中状态和未选中状态展现不同的图片,未选中的图片没有边框,选中后的图片用金色边框修饰,同时用代码控制放大选中图片,放大倍数为1.1倍,起到突出选项的作用。选择界面如图3所示。

图3 选择界面

2.2 手势堆绣

2.2.1 Kinect连接

本研究所使用的Kinect设备是新一代Kinect v2传感器,与上一代Kinect v1相比,其视野更广阔、视频更高清、骨骼追踪更精确,具有传输速度快、精确识别以及方便使用等特点,能够满足设计者的多种需求。传统的彩色摄像头对背景、光线等因素的要求较高,而Kinect v2传感器对环境的适应能力相对较强,为开发者们研究体感互动提供了极大的便利。实现Kinect与Unity3D的连接,需要确保Kinect传感器与电源集线器相连接,并且电源集线器要接电,之后将Kinect设备通过USB3.0连接到PC机上。在本机PC上安装Kinect for Windows SDK v2.0,安装好后,本机PC上会出现SDK Browser应用,打开该应用,启动Kinect Configure Verifier项,检测设备是否连接成功。将Kinect For Windows Wrapper中间插件导入项目,并且添加Kinect Manager以及Kinect Gestures脚本于项目中的任意一个物体,实现Kinect与Unity3D的连接以及对Kinect的控制。

2.2.2 人体数据采集

Kinect能够采集人体的多种数据,对人体进行骨骼追踪。其主要利用三个不同功能的摄像头,分别进行拍摄范围内深度数据、彩色数据的采集以及红外检测,采集到的人体数据如图4所示。基于采集到的深度数据进行骨骼数据计算,追踪到人体的25个关节,识别人体动作。对这些数据建立编程模型,在人体识别的基础上实现手势识别。

图4 人体数据

2.2.3 手势识别

手势识别的主要依据就是提取特征参数,根据不同的特征参数对手势进行分类。手势识别过程如图5所示,需要在Kinect采集用户骨骼数据的基础上,添加Kinect Manager等组件,Kinect Manager功能多样,它可以实现Kinect的初始化,完成数据采集工作还可以分析处理数据,并且定位到人体骨骼位置,将骨骼数据进行输出。由于Kinect Manager脚本已经对Kinect采集到的数据进行了处理,并将各个功能封装成函数,在实现一些功能的时候,只需要访问Kinect Manager组件,获取需要的方法或属性即可。通过对其组件的控制,提取到手部骨骼参数,生成交互数据流,识别特定手势,实现对应操作。

编写脚本,实现手势控制功能,需要在脚本的Update函数里运用IsInitialized语句判断设备是否准备好,如果准备好,即返回结果为True,再运用IsUserDetected函数判断是否检测到用户。如果检测到用户,再运用IsJointTracked函数判断是否追踪到用户右手骨骼。顺利追踪到用户右手骨骼后,运用GetJointKinectPosition函数获取用户右手的世界坐标,将获取的世界坐标通过Camera.main.WorldToScreenPoint()方法转换为屏幕坐标,然后再将转换好的三维屏幕坐标转换为二维坐标。之后,将此二维坐标的位置赋予场景中设定好的手形图标,让手形图标随着用户右手的移动而移动。因此,场景中手形图标的运动状态即为用户手势的运动状态。

图5 手势识别

activeInHierarchy函数判断元素按钮的激活状态、RectangleContainsScreenPoint函数判断手形图标位置是否在元素按钮图标范围内。以上两个条件都满足时,可实现手势拖动后续操作。当手势状态为Close(握拳)状态,并且元素按钮名称为当前拖动元素名称时,元素的父物体转换为主面板,元素的位置时刻置为手势图标的位置,完成手势获取元素功能。手势状态为Open(张开)状态时,判断手势图标及拖动元素是否在当前拖动元素的线框范围内,如果在线框范围内,则将当前元素位置转换为线框位置,完成放置正确元素吸附功能;
如果不在线框范围内,元素父物体转换为本身设定好的父物体,元素位置设置为本身父物体位置,将元素归位。元素拖动期间,倘若用户丢失或者手势丢失,同样将元素归位。手势堆绣过程如图6所示。

图6 堆绣过程

通过访问Kinect Manager脚本组件,实现Kinect与Unity3D的连接,通过脚本的编写,得到用户的手势信息,从而实现手势交互的功能。手势识别过程关键代码如下:

//第1步:判断设备是否准备就绪。

bool IsInit=KinectManager.Instance.Is-Initialized();

//第2步:判断是否检测到用户。

bool IsUser=KinectManager.Instance.I-sUserDetected();

//第3步:获取用户ID。

Long UserID=KinectManager.Instance.GetPrimaryUserID();

//第4步:检测用户右手骨骼。

bool HandRightSkel=KinectManager.

Instance.IsJointTracked(UserID,(int)KinectInt-erop.JointType.HandRight);

//第5步:获取右手位置坐标。

Vector3 RightHandPos=KinectManage-r.Instance.GetJointKinectPosition(UserID, (int)KinectInterop.JointType.HandRight);

//第6步:检测右手手势,执行对应操作。

KinectInterop.HandState RightHandState=KinectManager.Instance.GetRightHandSta-te(UserID);

if(RightHandState==KinectInterop.H-andState.

Closed)

{

print(“右手握拳”);

……

}

2.3 二维码实现

2.3.1 屏幕截图

场景中设置三个空物体,第一个物体位于主面板左下角,第二个物体位于主面板右下角,第三个物体位于主面板左上角。主面板的宽等于第二个物体的X坐标减去第一个物体的X坐标,主面板的高等于第三个物体的Y坐标减去第一个物体的Y坐标。创建一个RGB24位格、大小等于主面板宽高的Texture2D纹理,运用ReadPixels函数读取屏幕指定范围内的内容到自定义的纹理当中。执行Apply函数保存纹理,运用EncodeToPNG函数将纹理编码为PNG格式,通过File.WriteAllBytes()函数将截图以指定名称保存到指定位置。

2.3.2 图片上传

用String字符串获取截图保存路径,UnityWebRequest.Get()方法可获取该路径图片的字节数组。开辟一个WWWForm类,运用AddBinaryData函数在实例化的WWWForm中添加图片的字节数据。通过网络请求UnityWebRequest的Post方法,将图片上传到服务器。上传成功后,服务器将返回Json字符串,返回的Json字符串中包含三个键值对,分别为code代码、msg提示信息和data数据。data数据对应的值为图片上传后的链接,通过Split字符串分割方法截取Json字符串中的图片地址链接,保存到一个新的字符串中,以便后续二维码展示过程中使用。

2.3.3 生成二维码

ZXing由Java语言所实现,可以生成和解析二维码,内容开源,能够为其他语言提供接口,可以对各类条形码进行图像处理。生成二维码需要下载ZXing中的ZXing.unity.dll插件,导入Unity3D项目中,提供生成二维码的类库,然后添加与二维码相关的头文件,引用ZXing和ZXing.QrCode命名空间。之后添加Color32类型的函数,实例化一个BarcodeWriter二维码读写控件,设置二维码格式和区域大小。生成二维码后的效果如图7所示。

图7 二维码面板

本研究的二维码格式为QR_CODE,QR code格式的二维码应用比较广泛,有着极其广泛的编码范围和非常大的信息存储量。调用Encode方法对图片进行二维码生成,返回Color32数组,通过SetPixels32函数将返回的Color32数组设置到创建好的Texture2D纹理中。通过UI界面中添加一个Raw Image物体,并将生成的二维码图片纹理赋值给此物体,实现二维码在UI界面中的展示。

为验证本研究的可行性与有效性,文中进行了指定距离范围内有效的拖动堆绣元素的实验。指定距离指用户与Kinect传感器之间的距离,Kinect在1.5 m~2 m自身识别效果相对较好,因此实验距离范围设定为1.5 m~2 m。选取5名测试者,平均身高为160.6 cm。每位测试者需要在这一距离段内分别完成20次测试,并记录对应堆绣成功次数,共测试100次,完成本次实验,之后计算出不同距离段的平均有效率。指定距离段手势拖动元素的有效率如表1所示。

表1 有效率

实验测试结果显示,文中在Unity3D中所实现的基于Kinect的唐卡图像交互设计应用是可行的,识别率较高,平均有效率高达93%,能够有效地实现堆绣唐卡的堆绣操作。

本研究利用微软公司的Kinect传感器采集人体数据,以Unity3D软件为开发平台搭建人机交互界面,通过Kinect SDK等中间插件实现对人体的骨骼追踪和识别。在人体骨骼识别的基础上进行手势识别,再根据识别出的不同手势进行对应的堆绣操作,并以扫描二维码的方式保存堆绣作品,具有很好的交互性。实验结果表明,本研究能够有效地实现堆绣唐卡的堆绣操作,相对于传统的唐卡文化传播方式,本研究能够将现代科技与传统文化相结合,借助体感交互的趣味性,激发用户对唐卡艺术的学习和探究欲,让唐卡文化与时俱进,推陈出新。

该文只涉及到了唐卡文化中的堆绣文化,而且只用到了体感交互中的手势交互。因此,不论是唐卡文化的拓展,还是体感技术的推进,都有很大的发展空间。

猜你喜欢 体感唐卡手势 李雪:唐卡收藏进入理性阶段收藏·拍卖(2020年10期)2020-10-20挑战!神秘手势红领巾·萌芽(2019年9期)2019-10-09胜利的手势小学阅读指南·低年级版(2017年6期)2017-06-12知乎华声(2016年21期)2016-12-06以恭敬之心绘画净土慢生活(2015年5期)2015-12-15电动车体感防盗系统儿童故事画报·发现号趣味百科(2015年6期)2015-08-17唐卡:不仅是藏品,更是种信仰金融理财(2015年1期)2015-01-27认手势说数字数学大世界·小学低年级辅导版(2010年9期)2010-09-08症状奇特的“体感异常”祝您健康(1989年2期)1989-12-30症状奇特的“体感异常”祝您健康(1989年5期)1989-01-06