手势识别小思考

现状
手势识别分为:手形成的姿态的识别和手的运动轨迹的识别。前者更注重单帧的图像中手形成的姿态,后者更注重动态的图像帧序列前后帧之间的关系。
常见的手势识别包括以应用为导向的和以通用为导向的。以应用为导向的主要是指:根据某个应用需要哪些手势才去做对应的手势识别,以通用为导向的是指试图建立概括性的手势识别方案,可以对任何的姿态及轨迹进行识别。
具体到姿态识别的工作上来说,常见的方法分为 appearance-based 和 model-based 两种。Appearance-based 是指根据深度图像和二维图像提取特征,根据训练用例训练分类器,然后测试调参数等。然而,这种方案主要的缺点在于需要大量的数据做训练同时训练的过程将十分漫长。然而在这种情况下,这种方法在实际使用的过程中过程较快。Model-based 是指建立手部的模型,该模型有一些参数,这些参数确定手所形成的姿态。这种方法就是指利用这些参数构成的模型与实际的姿态相匹配,不断调整参数使得两者之间的差距最小。
注意
我们需要解决的是特定方向上的手势识别还是通用的?难度会有很大的差距。
即使是对于通用的手势,appearance-based 的方式也需要预先确定所需要识别的手势以便训练。
姿态识别(appearance-based)
流程图

Flowchart for Hand Recognition

实验数据选择
NYU有手势数据,但是并没有提供带深度的手势数据,只能用二维图像做训练和测试。
其他也有一些二维图像的手势数据,但都基本上没有带深度的数据。
分割
在现实环境中,由于各种各样不同的背景、光线、遮挡等因素的存在,使得分割出手的过程相当困难。
在我们的实验环境中,由于 Kinect SDK 的存在,我们可以很简单方便的找到手的位置。然后我们可以提取手所在区域的图像,作为预分割的结果。
下面我们要做的是从这预分割的图像中找到具体手的轮廓。
人类皮肤的空间颜色在色度中的分布是聚类在色度空间中一个较小的区域中。所以,为了减少环境的影响,我们会使用 HSV 颜色空间来进行分割。
可以采用的分割的方法有:基于像素颜色进行分割,找到轮廓然后分割。
此外,还需要图像做平滑处理及形态学处理(膨胀、腐蚀等)。
方向校正(有深度数据集的情况下)
由于深度图像上的特征考虑到了不同的深度区间上的点云占比,所以我们需要预先对手势的方向进行校正。
提取特征
根据多篇论文,手势识别所注重的特征有:
指尖凸起点的个数,CSS 描述子,傅里叶描述子,轮廓长度、手的面积、图像边界、框长度等之间的比例。(CSS 形状描述子作为静态手势特征缺乏整体方面的描述、傅里叶描述子在手势局部描述中有欠缺)
深度图像:将手所在区域提取出来,然后按深度分为多个区间,每个区间内点的数量占点云总数的百分比[基于 Kinect 深度信息的手势提取与识别研究,邓瑞]。
分类器训练
SVM。
测试及得到结果
然后实验及测试。
手的运动
手的运动信息,可以简单的分为前后、左右、上下六个方向,也就是说,XYZ 三个轴各自的正负方向。
可以把手的坐标记录下来,存放在一个固定长度的队列中,每次比较队列中手的 XYZ 三个方向的坐标,然后对每维坐标进行分别的分析。如果某一维或多维的坐标变化幅度较小,那么可以认为其在这个方向上没有变化。如果某一维或多维变化幅度较大,则认为其在这个方向上有移动。
具体的变化幅度阈值、每秒采集图像帧的数量、队列的长度都会对运动信息结果造成影响,所以这些值需要仔细实验调试。