张仲一,杨成,吴晓雨
(中国传媒大学信息工程学院,北京100024)
人手拥有人身体最灵活的肌肉,他不仅可以帮助我们完成日常的劳动,还可以帮助传达丰富细致的信息,例如本文将要实现的人手三维空间虚拟键盘输入功能。基于视觉的手指交互现在及不久的将来在人机交互领域将有广泛和重要的用武之地,主要包括四类:(1)手语识别,利用计算机视觉和红外深度影像,应用图像处理技术,完成手语、语音、文字指尖的相互转换,以帮助聋哑人群。(2)手势识别,利用静态或动态手势进行人机交互,在身份识别、机器人控制和家用电器控制等方面具有广阔的应用前景。(3)虚拟触控技术,使用非接触式的空间虚拟触控系统,通过手掌和躯干的运动,操纵游戏、娱乐、多媒体设备。(4)手指书写,使用手指的运动轨迹判定识别方法取代传统键盘的文字输入方式。而最后一项内容,就是本系统研究的主要目的。由于人手具有很高的复杂形变的特点,所以手指运动分析是一个很难的课题[1]。
Kinect是美国微软公司为XBOX360游戏机开发的一款体感外设,于2010年11月4日正式推出。如图1所示。
图1 Kinect体感外设
Kinect事实上的核心是三维体感摄影机,并使用即时动态捕捉、影像辨识、麦克风输入、语音辨识功能让玩家不在依赖于使用手柄,通过玩家的四肢运动操作游戏。Kinect是由一个RGB摄像头和一对由红外发射器和CMOS接受器组成的深度摄像头所组成的,可以得到场景的RGB颜色信息和深度数据。
Light Coding技术理论是利用近红外光对测量空间进行编码,经感应器读取编码的光线,交由晶片运算进行解码后,产生成一张具有深度的图像。Light Coding技术的关键e雷射光散斑,当雷射光照射到粗糙物体、或是穿透毛玻璃后,会形成随机的反射斑点,称之为散斑。散斑具有高度随机性,也会随着距离而变换图案,空间中任何两处的散斑都会是不同的图案,等于是将整个空间加上了标记,所以任何物体进入该空间以及移动时,都可确切记录物体的位置。Light Coding发出雷射光对测量空间进行编码,就是指产生散斑。Kinect就是以红外线发出人眼看不见的雷射光,透过镜头前的光栅将雷射光均匀分布投射在测量空间中,再透过红外线摄影机记录下空间中的每个散斑,获取原始数据,再通过计算生成深度图像。
Kinect的优势是无论周围环境的光照条件强弱,都可以被Kinect的CMOS红外传感器所感知。红外传感器通过灰度值的大小来标度被测物体的深度值,也就是其传感器的距离:越黑表示距离越远,越白表示距离越近。Kinect测量感测范围内的所有物体距离摄像头的深度,并保存为景深数据图。传感器以每秒30帧的速度生成景深图像流,以达到实时的数据监测[2]。
最初,微软并没有公布其它平台的Kinect驱动程序。国外的Kinect开发者们以及开源社区对其破解,使其可以应用到PC平台之上,并且对于代码开源。2月 1日 Microsoft正式使 Kinect支持于Windows系统平台并公开发售 window版 Kinect。Microsoft同时推出 SDK 1.0,Kinect for Windows SDK是微软 Kinect设备的开发工具包。目前最新的微软Kinect SDK为Kinect for Windows Developer Toolkit v1.5.1。
我们所使用的驱动为OpenNI。OpenNI(开放式的自然交互),Open Natural Interaction的缩写而来,一个由业界领导的非营利组织。该组织专注于提高和改善自然交互设备,应用软件的互操作能力。通过使用这些硬件和中间件(软件)来很方便的访问和使用一些设备。主要成员之一是PrimeSense公司,Kinect的核心芯片正是这家公司提供的,因此它的使用较为广泛。OpenNI定义了自然人机交互所需的很多API,提供一个多语言跨平台的开发框架。
系统的原型设计流程图图2如下:
图2 系统流程图
图2所示是系统的的实现过程,开始时在PC主机上获取Kinect的RGB图像和深度图像。之后将获取的原始数据,进行图像的一些相关预处理工作,包括图像校正和滤波降噪处理。为了得到手型的轮廓信息,系统使采用深度图和RGB图相结合的方法,进行人手分割。然后再根据轮廓点序列,检测出指尖的空间坐标值。最后通过以上所得数据,完成空间键盘输入操作。
2.2.1 图像校正及预处理
KINECT传感器可以同时获取RGB彩色图像数据以及深度数据图。本系统通过Depth Generator imageGenerator两个OPENNI提供的接口获取RGB图和深度图。为了抑制数据中的噪声干扰,对于深度数据进行高斯滤波处理。高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值[3]。
2.2.2 图像二值化
首先,设计此系统的需要消除背景信息和其他多余的人物干扰。由于KINECT拥有深度摄像和RGB摄像头,我们只获取主操作者的数据,丢弃背景数据和和其他摄像头范围内人物。这识别人物,分割背景功能的实现,使用了OPENNI的User Generator模块。
主操作者和背景信息的输出存储在一个标签数据图之中。如果一个深度像素的被判定为背景像素则其值被标记为0,如果像素点是属于用户的范围,则这个像素被标记为用户的ID号。
之后,系统将用户的双手部分从身体范围内分割出来。因为我们不要用户的全身数据,只需要双手的区域。因为当手伸出来时,手是身体离 KINECT最近的部分,所以系统设定一个深度阈值作为分割的门限把手部从身体分割出来[4]。
公式(1)为手部深度分割公式
将得到的包含手部多灰度级的图像变成只有两个灰度级的图像。用阈值T作为分割值,T的值略大于手心点的深度值,从而得到手部的准确轮廓。
提取更为准确的手部区域,以便于之后对于手掌轮廓的提取。虽然可能存在干扰区域,但手部区域应该是所有可能区域中,最大的一片连续区域。检索所有可能范围内最大的闭合区域,并计算该区域的几何中心,作为手心点。一般来说,手掌的长宽小于20cm,所以切割以手心为中心,边长为20cm的正方形区域[5]。
图示如下:
图3 手掌矩形
2.3.1 指尖检测
对于凸包轮廓的检测,本系统采用葛立恒扫描法[6]。该方法的具体步骤为:
1)首先,检索所有边缘点之中Y值最小的点。当Y值最小的点多于一处时,则在这几个点之中选取X值最小的点,将此点设为基点P。
2)将所有边缘点与基点P连线,并计算连线与X轴之间的夹角数值。依据夹角数值的大小顺序,将所有点进行排列编号,记为 P[0],P[1]…P[n]。
3)假设存在一条从P[0]依序连接到P[n]的虚拟路径。判断一点到下一点的转向是“向左转”还是“向右转”。如果是向右转,则证明之前一点不属于凸包集。只有向左转,才把前一点判定为凸包点,并加入堆之中栈。以此算法检查所有边缘点,并得到凸包轮廓。
4)对于向左转还是向右转的判定,算法是把三个连续的点看成一个夹角向量((P1,P0),(P2,P0)),d=(P1,P0)*(P2,P0)。如果 d 值大于 0 则为右转(顺时针方向),d值小于0则为左转(逆时针方向),d等于0则为直线。
在完成凸包点检测之后,继续计算凹缺陷点。
2.3.2 指尖点筛选
使用以上获得的数据进行更精确的指尖点筛选。把一个凸包点命名为起始点P1,下一个凸包点命名为终结点P3,在这两点之间的凹陷点命名为深度点P2。起始点和终结点都有可能是指尖点。把(P2,P1),(P2,P3)设为两个向量 V1,V2。当 V1,V2 的夹角小于100度,两个向量的长度之和大于手掌矩形变长的一半,则把起始点和终结点判定为指尖点。
图4 指尖点和凹缺陷点(紫色点计算所得指尖点,黄色点为凹缺陷点)
使用之前得到的手部的指尖点以及凹缺陷点数据、掌心点数据建立一个手型点击的的基本数据单元,它是由两个相邻指尖与一个他们之间的凹缺陷点组成的夹角结构。这个数据模型需要以上所有点的三维坐标值。然后计算一个凹缺陷点与相邻的两指尖点所组成的夹角的大小,也就是计算向量P1P2和P2P3在YZ投影平面的夹角值α。
通过对希望触发点击事件时,手指动作数据的统计分析,得到一个合理的阈值α。每当指尖夹角大于阈值α时,则判定点击事件被触发一次。
图5 手指点击是指尖点在YZ轴上的示意图
系统通过Open CV创建键盘窗口,在键盘窗口内布置1到10十个数字键点击区域。用户在处于KINECT体感摄像头前1米左右进行空间键盘点击动作。对于每个按键进行样本容量为50次的试验测试,结果如下:
表1 打开屏幕键盘文档的输入
在虚拟键盘点击实验结果来看,人手处于KINECT摄像范围中心时,点击事件识别率较高,而处于KINECT摄像范围边缘时,识别概率相对较低。原因是人手处于边缘区域时,由于手掌相对于摄像头的拍摄角度的问题,在人手进行深度分割之后所得手掌轮廓边缘曲线有一定的变形,最后导致指尖识别定位效果下降。
[1]李文生,解梅,邓春健.基于多点手势识别的人机交互技术框架[J].多点手势识别的人机,2011(6).
[2]OpenNI User Guide[S].PrimeSensor Ltd.
[3]汤勇,顾宏斌,周来.交互系统中实时手势分割及指尖检测方法[J]. 光电工程,2010,37(7).
[4]He G,Kang S,Song W.Real-time Gesture Recognition using 3D Depth Camera[J].
[5]Raheja J L,Chaudhary A,Singal K.Tracking of Fingertips and Centres of Palm using KINECT[J].
[6]耿海进.基于三维视觉的手势跟踪及人机交互中的应用[D].南京:南京大学.