来源:http://tech.163.com/16/0503/10/BM4QI1OF00094P0U.html
2013年,初创公司Leap发布了面向PC及苹果电脑MAC的体感控制器Leap Motion。但是当时Leap Motion的体验效果并不好,又缺乏使用场景,与二维计算机及终端有着难以调和的矛盾。
而VR的出现,仿佛为Leap Motion新开了一扇天窗,Leap Motion倡导的三维空间交互与VR可谓完美结合,因此Orion应运而生。Orion是原有的Leap Motion软件的一个升级版本,硬件不变。在VR系统中,Orion提供了一种手势的输入方式,它可以将手部的活动信息实时反馈到处理器,最后显示在VR头显中。
简单来说,Leap Motion是基于双目视觉的手势识别设备。那什么是基于双目视觉的手势识别呢?
基于双目视觉的手势识别
顾名思义,双目视觉就是有两个摄像头,利用双目立体视觉成像原理,通过两个摄像机来提取包括三维位置在内的信息进行手势的综合分析判断,建立的是手部的立体模型。这种方法对于用户手势的输入限制较小,可以实现更加自然的人机交互,但由于需要进行立体匹配,且由于立体模型的复杂性,需要处理大量的数据,计算相对来说较复杂。
要实现双目手势识别首先需要对双目摄像头做标定,即是计算空间中左右两台摄像机位置的几何关系。首先是对单摄像机的标定,其主要任务是计算摄像机的内部参数(包含摄像机的投影变换矩阵和透镜畸变参数)和外部参数(包含相对于某个世界坐标系的旋转矩阵和平移向量),形象点说,摄像机本身存在畸变,如果不经过标定过程,摄像机所拍摄出的影响是存在畸变的,即可能将原本的矩形显示成不规则的圆角四边形。然后是标定,即计算空两台摄像机在空间中的相对的几何位置关系(包含旋转矩阵和平移向量),通俗讲就是使得两台摄像机所成的影像显示在同一水平线上。
接下来就是具体的手势识别过程了。
首先从双目摄像头采集操作者手势动作的左右视觉图像,通过立体视觉算法生成深度图像。具体过程:经过立体标定后获取经过校准的立体图像对后,进行立体匹配,获得视差图像,再利用摄像机的内参数及外参数进行三角计算获取深度图像。
然后对左(或右)视觉图像使用手势分割算法处理,分割出的人手所在的初始位置信息,并将该位置作为手势跟踪算法的起始位置。
再使用手势跟踪算法对人手运动进行跟踪。
再根据跟踪得到的结果进行手势的识别。需要说明的是,如果跟踪目标消失,则重新进行手势分割,再重复上述步骤。
双目手势识别流程图如下:
Orion采用的即是双目手势识别方法,其实现流程与上文所描述的双目手势识别实现流程基本一致,但是通过各种基于Orion的实验,我在这里对Orion的细节算法做一个猜想,仅供读者参考。
Orion相比于上文所述的双目手势识别基本方法不同之处在于,Orion在获取深度图像的步骤,并未对整个手型上的所有点做立体匹配,而是只选择了13个左右的特征点(图中蓝色点)做匹配,获得这13个左右特征点的信息后再利用IK算法推算出整个手部模型。
基于一些实验,我猜想Orion选择的特征点是13个左右,如下图中蓝色点:
基于这13个左右的蓝色点即可利用IK算法推算出图中红色点的数据,并最终获得整个手部模型。这里我说一下为什么猜想是匹配特征点而不是匹配所有点:
Orion的处理时间为8ms,即从读到手的图片到做完所有计算的时间只有8ms。这个时间是非常短暂的,要基于这样的时长来做整个手型上所有点的立体匹配是不可能的,只能选择一些特征点来做匹配,再根据特征点数据去推算(或者说估计)其他点的点云数据。
我所画出的这13个点均是较易匹配的点,而基于这些点即可利用IK算法构建整只手的模型。例如某根手指,基于指尖和指根两个点,即可根据手指长度等信息利用IK算法推算出手指其他关节点的数据。
此外,如果是匹配所有点,则Orion识别手指个数应该更加准确一些,但是目前基于我的实验显示,Orion手指个数识别存在较大问题,具体实例可以参考下文场景描述。
Leap Motion——Orion的优劣势
首先我们看看Orion的优势。为了能够应用在VR行业中很好的发挥效用,Orion相比于前面的产品有了很大改进:
目前的刷新率为120HZ,延迟为4ms。一般情况下我们认为,VR领域需要将影像设备的延迟做到20ms以下,否则会损害沉浸体验,并且导致眩晕。VR头显屏幕本身就存在一定延迟,交互设备就必须不能有过大延迟。虽然目前实际的延迟比4ms还是要大一些,不过能做到10ms以下,基本也不影响目前的应用。此外,实际视场角达到150度,适配目前的VR头显还是非常有优势的。
初始化:在初始化方面,Orion有非常大的改进。所谓初始化即手部首次进摄像头拍摄范围内的手势,以前Orion对于首个手势识别非常有限,仅能识别五个手指张开的手势。而新的产品则在该方面做了很大改进,目前,以一些常规的不复杂的手势进入都没有问题,例如五个手指张开、一个手指张开其他握紧等。(这里所说的复杂的手势是指Orion本身无法识别或者识别错误率较高的手势,例如两根手指叠加在一起的手势等。)
翻转: 同样,Orion在手部翻转方面有很大改进,准确率有很大提高。
以上是Orion目前应用于VR行业的优势,也是其可以应用于VR行业的基础。至于劣势,我根据自己实际体验的结果,给大家说几个Orion目前体验效果不够好的场景,读者也可以拿出自己的Leap Motion设备测试一下看看事实是不是如此。
手指检测不够准确:Orion在手指检测方面做得依然不够好,如下图手势:
即当我们的中指处于微张开状态下,Orion多数情况下会识别成完全张开或者完全收起,当我们慢慢的张开中指的过程中,Orion识别的手势也会有一个突变,及很容易从完全收起的状态突然变为张开状态,而失去了张开过程中的手势跟踪。
这里只是说明其中一个例子,其实还有很多其他这样的手指检测不够准确的状况。
手指个数检测不够准确:Orion手指个数检测存在很大问题,这里我简单介绍两种情况:
上图展示的是将两个手指认成三根手指,即当使用者两个手指分开过大时,Orion很容易在两个手指中间再添加一个手指。这个问题出现的原因依我猜想可能是Orion在手势检测中对于两个手指的张开距离有一个阈值,如果大于这个阈值就认定中间还有一根手指,而之所以没检测到这根手指的指尖特征点可能是由于遮挡。
上图展示的是一个较复杂的手势,识别出现错误。因为Leap Motion的摄像头在使用者头顶上,以摄像头视角看中指与食指重叠,无法拍到中指指尖。因此算法判定只有一根手指张开,即出现上图所示识别状态。
侧面手指信息过少,估计不准确:Orion对处于侧面的手势识别很差,这也是当时作者猜测其使用13个特征点匹配的一个小原因。当手处于侧面面对摄像头时,特征点大部分均被遮挡,造成手部准确信息非常少,所谓的估计就基本上是胡乱猜测了,因此无法准确判断侧面的手势中手指的状态。如下图即是手部侧面对着使用者佩戴的Leap Motion,将两根手指识别成三根手指:
目前国际上比较具有代表性的还有RealSense的手势识别,该产品应用的是深度摄像头,可以直接获取深度图像。得到深度数据后,后面的具体算法步骤就与双目识别的一样了。这种直接获取深度图像的算法,因为本身具有手部所有点的深度信息,不需要估计,因此准确度更高。国内采用深度摄像头的有我们G-Wearables团队独立研发的StepVR产品中的手势识别方法。
基于深度摄像头的手势识别方法无需购买昂贵的设备,仅需要深度摄像头、PC机即可,手势识别准确率高,并且在操作时更加自然、方便,符合以人为本和自由性的要求,是手势识别未来发展的趋势。对基于深度摄像头的手势识别感兴趣的读者可以关注我后续的文章。