首页 > 代码库 > 手势跟踪论文学习:Realtime and Robust Hand Tracking from Depth(四)Hand Initialization

手势跟踪论文学习:Realtime and Robust Hand Tracking from Depth(四)Hand Initialization

论文阅读原创,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/39251373

在多次的阅读这篇论文以后才明白文章的结构为什么这样安排:将Hand Initialization这部分放在文章的所有的优化算法的最后,说明整个算法即便是不要这一部分的优化也是可以的。我们从文章中的Table 2可以看到,不使用Hand Initialization得到的结果比使用到Initialization的结果差2mm。若是你对于最终的结果要求不是很高的话,其实可以忽略这一部分了。

我们从Hand Initialization开头的部分发现若是你使用Initialization,那应该是对每一帧都要进行:re-Initialization的(其实这一点我不知道为什么不用上一帧的结果作为下一帧的初始化)。


1. 回顾

  我们先回顾一下,没有做初始化我们的输入数据是什么。首先我们通过Intel的Creative Gesture Camera得到的数据,经过中值滤波,去除噪声点,形态学处理填补好空洞。然后将数据投影为3D的点云。从这些点云当中随机的取出256个点。这样就得到而来输入数据。


  输出数据为我们的一个48球的模型的参数。我们就是通过解那个Cost Function得到模型的参数解。


2.反思

我们来思考一下那样存在的问题。首先,我们从里面随机的选取了256个点云;这样少量的数据已经使得求出的解的可靠性不是很大。其次,当你手势存在很多的遮挡弯曲的时候,那么得到的点云数据本来就很集中,这样去和一个神展开的48模型区匹配本来就不是很合理。因此这样做初始化是比较有必要的(这是我的猜测)。


3. 初始化方法


本文采用的初始化的方法是: Part Detection的方法。具体就是先检测到手指,有手指来初始化手的Pose。所以接下来分为两个部分来讲解。

Finger Detection:

文中采用了一种比较巧妙的做法就是:将一个3D的Finger拆成一个X-Y Finger和一个Z-Finger来做的。


X-Y Finger也就是平行于x-y平面的手指。那么我们从深度图进行二值化处理就可以得到一个手的mask(也就是去除掉了冗余信息,比如我们将Depth小于0.5m的设为0,大于0.5m,小于1.5m的认为是1.也就是去掉了在这个范围以外的点)。这个时候,我们从这个mask上面初始化一个极值点作为起点,然后计算测地线距离(我的理解是曲面上面两点最近的距离线)。当测地线的距离最远,但是又基本上又和一个手指的距离差不多的时候我们就认为这是一个手指,我们在对其Size进行扩展,直到得到一个手指的形状。

Z-Finger被认为是一个垂直于摄像头的点。我们从深度图像中找到里面的局部最小值。然后我们通过flood fill泛洪填充算法)填充这个深度图直到达到一个指尖的距离。这个时候我们画两个圆(外面的比这个球体的半径大3个像素,角度60度)来看两个圆构成的Ring(环形区域)中包括的像素在90%以上我们就认为这是一个Z-Finger。


Hand Initialization:

得到了Finger以后,我们就利用已知的Finger来初始化Hand Pose了(具体的就是解文章中的那个方程)。

手势跟踪论文学习:Realtime and Robust Hand Tracking from Depth(四)Hand Initialization