基于Kinect的手势识别与阈值法
2016-05-14陈保苏顺开
陈保 苏顺开
摘要:Kinect技术的发展,让人机交互的方式由传统的键盘、鼠标转化成了对人体动作的识别。在识别人体手势的基础上,对深度图像的对象获取成了进一步图像处理的关键,阈值法是常用的对象获取方法。本文中对阈值法区分对象和背景详细描述,得出获取最佳阈值表达式。
关键词:Kinect 深度图像 对象 阈值
中图分类号:TP391.41 文献标识码:A 文章编号:1007-9416(2016)07-0056-02
1 手势识别的基本方法
随着现代科学技术的发展,人体向机器发布施令方式除了传统的鼠标键盘外,利用人体动作和手势与机器进行交互成了目前的研究热点问题。微软的体感技术设备能够获取深度图像、人体骨骼及手势动作或声音,向人们提供了一种全新的人机交互模式。基于Kinect的人体动作识别技术目前仅能识别简单的目标行为,一般动作是单一的,场景也比较简单。复杂动作和多目标或多行为的人体识别还是不多见的,手势动作识别过程是动态的系统过程,识别方法目前主要有基于模板和基于概率统计或基本语法的方法。如下图1所示。
人体手势动作识别的下个步骤就是人体三维建模,Kinect设备有摄像头和红外设备,能够对拍摄的物体生出三维数据。但是虽然Kinect有红外发射器但是它并不能直接提供原始的红外数据,还需要在计算机内部进行数据处理,从而得到所拍摄物体的深度数据。事实上深度数据是由深度图像得到的,所以要对深度数据处理前,要先获取被拍摄物体的深度图像。
2 Kinect获取对象的阈值法
Kinect对获取的深度图像进行数据处理主要采取的是阈值法,所谓阈值法就是指将要处理的数据与系统内已经设置好的一组数据相比较,然后根据结果和给定的阈值相比较,查看结果是否在阈者范围之内来决定是否保留或删除该数据的一种处理方式。阈值法最大的优点就是直观并易于实现,在深度图像处理时常常用于图像分割,所谓图像分割是指对图像进行分区,它所依据的主要元素就是图像上的部分特征,包括图像上像素灰度、目标纹理、色彩等。图像分割往往把用户需要的部分作为提取对象,而其它部分则作为背景。利用图像分割可以将用户感兴趣的部分从背景中分离出来。
图像的特征往往用像素的灰度级来表示,容易提取,将用户感兴趣的图像和背景图像之间选择一个阈值,将所有灰度值大于阈值的点归为用户感兴趣的对象点,其它的值则表示为对用户无用的背景点。图像处理中的阈值点可以用下面的公式表示:
其中表示为图像中所选取点的灰度级的值,用户感兴趣的图像的像素表示为1,而背景像素的灰度级表示为0,T表示为系统所选定的阈值,表示经过灰度级的阈值处理后的新图像。
如果T的值完全取决于,则T被称为全局阈值,这种对图像处理的方法比较简单,并且易于实现,但是图像处理的精度不高,往往对图像有特殊的要求,比如图像的整体背景和对象区分比较明显。但是在实际的图像处理中,很难遇到这种比较简单的情况,往往处理的图像比较复杂,整个图像的阈值完全取决于一个的可能性不大,所以设置这样一个阈值不能很好的区分对象和背景图像。这里一般有两种方法来解决这个问题,一个是设置多个阈值,将要处理的图像进行分割,分割成不同的区域,然后按区域进行阈值设置,不同的区域按不同的阈值来处理,在一个区域内相当于全局阈值方式来获取对象或背景。另一种处理方法就是对灰度级进行校正,将图像的像素的灰度级校正到可以区分对象和背景。
阈值处理图像法的关键,就是选取合适的阈值。对于精度要求不高的图像可以采取灰度直方图,用眼睛观察直方图的峰谷,多次对比最后来确定阈值。但是对于精度要求较高的要处理的图像,这种方法显然不适合,需要用精确的数学表示方法来获取图像的阈值。假设图像的像素的灰度级具有正态概率分布的特征。对像的分布函数为,而背景的像素分布函数为,两者的方差分别为和,在图像中所占的面积分别为和。由此可以求出图像的概率密度函数为:
假设此处理图像的阈值为t,将灰度值在t之下的作为用户感兴趣的点,即对象点,将灰度值在t之上的点称为背景点。将背景点错误记为对象点的概率记为,将对象点被错误记为背景点的概率记为。
总的可能出错的概率为:
令上式达到最小值,即可求得最佳阈值t,利用求导公式对上式求导并令其为0可得。,化简后可得:
因为:,,将上述各算式整理并代入可得:。对该式两边取对数并去掉分母可得到如下式子:
,假设
,可以得出:,并由此可以得出图像的最佳阈值为:。
在人体动作步履研究中,多是基于二维图像对人体模型进行提取,由于二维图像的局限性,不同的视角下获得的信息常常分歧较大。三维模型可以很好的解决因视角变换激发的问题及遮挡景象,适合于三维空间的人体姿势表达,可人体模型是基于三维技术和立体匹配的编码。Kinect通过深度图像处理技术获得人体模型的三维信息,结合二维图像可获得更切确的三维模型信息。
3 对PPT操作进行手势识别
下面是使用C#编程,利用阀值来实现对PPT操作进行手势识别的一段代码:
//手臂垂直举起的阀值
private const double ArmRaisedThreshhold = 0.2;
//判别右手是否举起,若已举起,为True
bool isRightHandRaised = (rightHand.Y - rightshoulder.Y) > ArmRaisedThreshhold;
//判别左手是否举起,若已举起,为True
bool isLeftHandRaised = (leftHand.Y - leftshoulder.Y) > ArmRaisedThreshhold;
//当左手举起,控制PPT开始执行
if (isLeftHandRaised) //判左手是否举起,若左手已举起,为真。
{
if (!isBeginScreenActive)
{
isBeginScreenActive = true;
System.Windows.Forms.SendKeys.SendWait("{F5}"); //执行快捷键F5
}
}
else
{
isBeginScreenActive = false;
}
//当右手举起,就停止PPT的执行
if (isRightHandRaised) //判右手是否举起,若右手已举起,为真
{
if (!isStopScreenActive)
{
isStopScreenActive = true;
System.Windows.Forms.SendKeys.SendWait("{Esc}"); //即按Esc键
}
}
else
{
isStopScreenActive = false;
}
参考文献
[1]M.Camplani and L.Salgado.Efficient Spatio-Temporal Hole Filling Strategy for Kinect DepthMaps[C].Proc.SPIE8290,Three-Dimensional Image Processing (3DIP) and Applications II,February,2012:336-339.
[2]任海兵,祝远新,徐光,林学,张哓平.基于视觉手势识别的研究—综述[J].电子学报,2000(02):118-121.
[3]刘伟华,樊养余,雷涛.基于深度图像的运动人手检测与指尖点跟踪算法[J].计算机应用,2014(05):1442-1448.
[4]杨波,宋晓娜,冯志全.复杂背景下基于空间分布特征的手势识别算法[J].计算机辅助设计与图形学学报,2010(10):1841-1848.