APP下载

基于深度图像的动态指尖检测

2023-08-28敖良忠畅浩天丁坚贾文彬

传感器世界 2023年6期
关键词:二值指尖手部

敖良忠 畅浩天 丁坚 贾文彬

中国民用航空飞行学院航空发动机维修培训中心,四川广汉 618307

0 引言

近几年,计算机技术的发展使得人类生活的智能化成为主流,人机交互作为智能化的关键技术,已经变得越来越重要。机器人与人的交互方式一般包括语音交互、视觉交互、触觉交互以及虚拟现实/增强现实等等。机器视觉技术的蓬勃发展促使视觉交互成为人机交互的主流方式,也促进了机器人演示编程的发展。机器人演示编程即人教机器人如何去做,通过视觉传感器拍摄人的演示过程引导机器人工作是机器人演示编程的常用方法。手势作为视觉交互的一种方式,更贴近人与人的交流方法。在手势识别的特征提取中,手掌区域和指尖是最常用的特征,指尖的动态检测是对手势实时跟踪的主要手段。指尖检测有基于轮廓特征分析的[1-2],有基于肤色空间提取前景手部图像的[3-4],上述方法都是针对手部的彩色图像,容易受到光照与背景的影响。在深度相机推出之前,只能获取手部的彩色图像信息,目前,大多数深度相机厂家推出的深度相机都可以同时获取彩色和深度图像信息。近几年,基于深度信息进行手势识别与指尖检测已经有很多的相关研究。

1 概述

高晨等人[5]利用Kinect 获取深度图像,使用Open NI 手部跟踪器检测出手部位置,根据手部位置进行深度阈值分割,提出一种结合凸包和曲率检测指尖的算法。徐春凤等人[6]研究了一种依托NITE 库函数获取手部信息,再使用道格拉斯-普克算法得到手的轮廓曲线,最后利用轮廓分析法,从凸包点中识别出指尖。上述2 种方法都可以检测多个指尖,但是在手指并拢的情况下会出现误检,并且依赖第三方库提供的手部跟踪函数。姚玲等人[7]设计了一种将测地线距离和凸包结合的指尖检测方法,该方法在手指并拢时也有很好的检测效果。孟浩等人[8]提出了基于Kinect深度信息的指尖检测-跟踪-监督算法。文献[7]与文献[8]的检测方法具有较高的准确性与较强的鲁棒性,但是计算量较大,在跟踪速度上略有不足。

本文提出一种基于深度图像的动态指尖检测方法。首先,对获取的深度图像进行预处理,改善图像质量;再运用本文提出的距离分割,将所需距离范围内的前景深度图像分割出来;之后,将前景深度图像二值化,对二值图像使用帧差法,去除静态的部分;再运用形态学算法将静态的噪声去除掉,得到动态的手部区域。针对手部区域,先运用canny 算子提取手部轮廓;再获取轮廓凸包点并计算其曲率。由于单用曲率判定指尖点鲁棒性并不高,所以需要结合重心距离法来判断正确的指尖点,得到指尖点的像素坐标后,就可以提取该点的深度信息;最后,依据相机的内部参数与指尖点的像素坐标得出指尖点在相机坐标系下的三维信息。整体算法流程如图1 所示。

2 手部轮廓获取

2.1 深度图像预处理

图2 是由PrimeSense Camine 1.08 深度传感器采集的场景深度图像。可以看出,由于该设备本身硬件的原因,用该设备采集的深度图像质量并不高,存在较多的噪声与空洞。

为了后续的轮廓提取和指尖检测取得更好的效果,需要对获取的场景深度图像进行预处理。由于深度图像存在的椒盐噪声较多,本文采用中值滤波的方法去除噪声。中值滤波是一种非线性平滑技术,通过滑动窗口扫描整幅图像,将窗口内的像素值从大到小排列,将其中位数作为窗口中心点的像素值[9]。

中值滤波原理如图3 所示,设一个3×3 大小的扫描窗口,找出9 个像素值的中位数,将其作为中心点的像素值,可以有效去除像素值为0 或为255 的点。

中值滤波效果如图4 所示。可以看出,经过中值滤波的图像边缘锯齿感明显减小,同时,图像边缘轮廓的重要特征依然存在,且去除了手部少部分的空洞。

2.2 距离分割与二值化

PrimeSense Camine 1.08深度传感器测距范围在0.6~3.5 m 之间,如果想要较为准确地检测到手部区域,手必须在这个范围内活动。在实际应用中,例如体感游戏,手势识别机器人控制等一般不需要这么大的活动范围。

假设在实际应用中,需要在1~1.5 m 的范围内实时检测到手部区域,这时可以设定一个测距范围(可以是0.8~1.7 m)将手部分割出来,即依据距相机的距离进行分割。具体算法如下:

遍历中值滤波后的图像的所有像素点,并提取每一个点的深度信息,将深度信息在0.8~1.7 m(根据实际情况进行调整)的像素点赋值为0,其他的像素点赋值为255,这样就得到了分割后的二值图像,如图5 所示。

可以看到,成功获得了手部区域的轮廓,但是在0.8~1.7 m 这个范围内还有一把静态的椅子存在,所以同时也获得了椅背区域的轮廓。

2.3 帧差法

为了获得手部的二值图像,只有将前景二值图像中静态的部分去除。本文采用帧差法去除静态的背景。帧差法是对连续2 帧图像进行差分,得到对应像素灰度值的变化。其主要工作流程如图6 所示。

其中,fk(x,y)、fk-1(x,y)为连续的2 帧图像;Dx(x,y)为帧差图像;T1为设定的阈值。出现物体运动时,帧与帧之间会出现较为明显的差别,2 帧相减,得到2 帧图像亮度差的绝对值,判断它是否大于阈值[11]来分析视频或图像序列的运动特性。差分图像值为0,代表2个图像之间没有发生运动位置;值为1,则代表2 个图像之间发生变化的位置。

运用帧差法处理前景二值图像后的结果如图7所示。

帧差法虽然去除掉大部分静态的椅背部分,但依旧有椅背边缘的毛刺、噪声存在,会影响后续对手部轮廓的提取。

为解决上述问题,可以使用OpenCV 库中的形态学算法腐蚀(erode)。腐蚀算法是针对图像中的高亮部分即二值图像中的白色区域。为了不过多改变轮廓原有特征,同时能去除边缘毛刺,经过多次实验,将腐蚀算法的窗口设定为3×3 的大小,效果如图8 所示。

2.4 提取手部轮廓

在获得形态学算法处理的手部二值图像后,本文选用Canny 边缘检测算法提取手部轮廓。Canny 边缘检测算法是对信噪比和定位之乘积的最优化逼近算子,用来计算图像边缘的梯度幅度和相位值,选取合理幅度阈值来确定边缘点。检测效果如图9 所示。

3 指尖检测

3.1 提取轮廓凸包

凸包[12-14]是一个计算几何图形学中的概念。在二维空间中,凸包可以当成一条刚好围住所有点的圆圈。对于给定二维平面上的点集,凸包常常就是将最外层的点连接起来构成的凸多边形,它能包围点集中所有的点。OpenCV 中提供了函数convexHull 用于对物体轮廓凸包进行检测,其API 如下:

convexHull(InputArray points, OutputArray hull,bool clockwise=false, bool returnPoints=true)

其中,points 是输入的二维点集;hull 是输出参数,用于输出函数调用后找到的凸包;clockwise 是检索方向,当标识符为真时,输出凸包为顺时针方向,否则为逆时针方向;returnPoints 是操作标识符,默认值为true,此时返回各凸包的各个点,当输出数组std::vector 时,此标识被忽略。

对手部轮廓提取凸包的效果如图10 所示。

3.2 检测凸包点曲率

将手部最大轮廓和凸包的公共点作为指尖的候选点,设候选指尖点集为C,对于任意属于C的点Pi,在指尖点位置轮廓两边寻找距离指尖点最近的k个像素点。计算向量PiPi-k和PiPi+k之间所形成的夹角的k余弦值[10]:

由式(2)可知,向量PiPi-k和PiPi+k的k值决定k余弦的值。可以设定一个阈值β,当k余弦值大于阈值时,Pi即为指尖点。使用k曲率检测算法得到的Pi点如图11 所示。

从图11 中看出,虽然检测出了正确的指尖点,但也存在一些误检点。

3.3 重心距离法

检测曲率的方法虽然能够检测到指尖点,但有时从深度图像提取到的手部轮廓效果并不好,会出现误检点,所以就需要将误检点剔除。将曲率检测得出的正确指尖点和误检点作为新的候选指尖点,并放入新的点集D,再通过重心距离法寻找正确指尖点。

已知二值图像I(x,y),设像素点坐标为i、j,它的(p+q)阶矩Mpq为:

由上述公式可知,图像的0 阶矩为:

图像的1 阶矩为:

通过0 阶矩与1 阶矩可以计算出手部轮廓的重心坐标,如式(7):

得到重心坐标之后,遍历点集D,计算点集D中每个点到重心的距离的平方。

将D中距离重心最远的点作为正确的指尖点,并提取其二维像素坐标,如图12所示。

3.4 指尖点三维坐标

结合轮廓曲率与重心距离法,得到指尖点在初始深度图像中的二维像素坐标,之后就可以提取该像素点的深度值。已知指尖点的像素坐标及其深度值,再结合深度相机红外镜头的内参就可以计算出指尖点在相机坐标系下的三维坐标。

深度相机红外镜头的内参可由张正友标定法[15]获得,结果如下:

其中,(Cx,Cy)为主点坐标;(fx,fy)为焦距。

已知指尖点像素坐标(u,v),深度值d、s是深度图的缩放因子,由式(8)可得指尖点在相机坐标系下的三维坐标(x,y,z):

4 动态指尖检测实验

通过深度相机采集一段手部运动的深度图像视频流,运用本文的方法检测动态指尖,观察检测的效果,并从中随机截取9 帧进行分析,如图13 所示。

图14 是使用本文算法的指尖检测结果。可以看出,随机的几帧图像中,指尖位置、手部姿态各不相同,但是运用本文算法都能准确地检测到指尖点。

4.1 误差实验

第1 步,将一个圆锥形工件放在距离深度相机红外镜头的1 m 处,尽量使使圆锥顶点的实际深度信息为1 m;第2 步,开启深度相机并运行检测程序;第3 步,使手指运动到圆锥顶点处并记录此时程序输出的指尖点深度信息;第4 步,重复第3 步,共记录5 次。此为1组实验。

改变工件位置,分别在距离相机红外镜头1.1 m、1.2 m、1.3 m、1.4 m 以及1.5 m 处,共做6 组实验。实验数据如表1 所示。

表1 实验数据

4.2 误差分析

从表1 数据可以看出,几组数据的标准差都比较大,在3 mm 左右,每组实验的重复精度较差。主要原因是在实验中,人控制手指去重复触碰圆锥的顶点时并不能保证手指每次都会运动到绝对的同一个点,存在人为误差;还有一个影响因素就是设备本身存在的重复定位精度误差。

在表1 数据中,每组实验的均值都与实验预设的数据有差值,这个差值在1.418 mm 到20.654 mm 之间。这个误差来源一方面是由于测量工具、人为因素以及相机外壳等原因,使得圆锥工件并不能完全准确地放置在实验预想的位置,会导致一定的位置误差;另一方面就是设备本身的绝对精度误差。

5 结束语

本文提出的基于深度图像的动态指尖检测算法实现了指尖的实时快速跟踪,并且手部在不同姿态下都能定位指尖的位置,不受外界环境光线的影响,具有较高的鲁棒性,但是准确性方面会受到深度图像质量以及传感器本身精度的影响。由于本文提出的检测方法主要用于机器人的演示编程,而演示编程是人来引导机器人工作,会存在较大的人为误差,所以并不能用于对精度要求较高的机器人作业。但是演示编程的最大优点就是快速性、便捷性,本文的方法完全符合演示编程对快速性以及便捷性的要求。由于设备的限制,本文实验应用的深度相机精度并不高,如果能采用精度更高的视觉传感器,可以降低系统误差,从而提升检测结果的准确性。

猜你喜欢

二值指尖手部
手部皮肤软组织缺损修复的皮瓣选择
治理“指尖乱像”不宜一散了之
混沌伪随机二值序列的性能分析方法研究综述
支持CNN与LSTM的二值权重神经网络芯片
虔诚之花在指尖绽放
指尖上的生活,指尖上的美
基于二值形态学算子的轨道图像分割新算法
指尖童话
基于曲率局部二值模式的深度图像手势特征提取
两种皮瓣修复手部软组织缺损的比较