殷宏彬 赵悦 唐维彦 林闽旭 陆熊 黄晓梅
1 南京航空航天大学 自动化学院,南京,211106
近年来,随着人机交互技术的飞速发展,鼠标、键盘和遥控器等传统人机交互接口已经不能满足涉及三维信息的人机交互需求,寻找更加便捷、自然的人机交互方式已成为该领域关注的热点[1-2].而首要问题就是需要机器能够正确地认识和理解人的行为.在这种背景下,位置检测问题被人们提出.位置检测是人机交互的基础,只有准确检测到人体位置,才能确保机器对用户的操作进行正确处理.
在各种新颖的交互技术中,手势因其灵活性和多样性而受到越来越多的关注.然而人手的运动是人体运动中最复杂的部分,对人手的位置检测方法研究具有极大挑战性[3].在过去的几十年里,研究人员通常使用数据手套作为标记来跟踪手的位置[4].例如Glauser等[5]基于拉伸传感器制作了数据手套以实现人手的追踪与重建,具有很高的精度.然而,由于佩戴不便、调试复杂等原因,该方法很难广泛使用.相比之下,非接触式视觉检测方法具有成本低、对人体舒适等优点,是目前流行的人手检测方法.如孙莉红等[6]和郭怡文等[7]均采用帧差法、肤色分割法等算法进行人手区域分割,实现了基于肤色的手部定位与跟踪.但由于基于二维图像序列的识别方法稳定性较差,复杂的背景和光照变化都会影响肤色检测的效果,因此很难获得期望的结果.此外,研究人员也通过基于光学、电磁学等其他方法实现了人手位置检测.如孙俊彬等[8]通过在手指位置安置激光信号接收器,通过计算光学基站发射的激光平面到达被定位物体的扫描时间,实现三维空间中手指位置的精确定位.Ma等[9]提出了一种基于可见光的3D手指跟踪技术,他们通过投影仪将光编码图案投影到桌子、显示器等物体表面,并使用光传感器对投影光进行检测并解码,从而获得手指的三维坐标信息.Chen等[10]提出了一种基于电磁场的多点手指跟踪系统,用户在指尖佩戴电磁铁,系统则通过计算电磁体和4个磁性传感器之间的距离,使用三边测量法确定电磁体的3D位置,实现手指位置检测.
2010年微软推出的Kinect体感设备,因其作为人机交互接口性能优越、价格低廉,而被广泛应用于人机交互领域.由于Kinect传感器配备了深度摄像机,大大简化了基于视觉的手部检测.例如Zhao等[11]提出了一种基于 Kinect的虚拟康复系统,通过Kinect检测用户上肢的位置信息,指导操作者执行指定动作,实现对中风患者的康复
训练与恢复评估;Mohsin等[12]提出了一种多深度传感器的标定方法,通过多个Kinect深度传感器数据的融合,对身体的四肢等关键部位进行定位,当主传感器深度图像中的任何一个标定点被遮挡时,可以利用标定参数从其他传感器的深度帧中获取该点的坐标,克服了遮挡问题;Schröder等[13]提出了一种实时手部跟踪和姿态估计方法,通过让用户佩戴上彩色手套,并由Kinect的彩色相机与深度相机对其进行检测,实现对人手的定位与跟踪;Kumar等[14]则将Kinect与Leap Motion传感器进行融合,分别从手的下方(Leap Motion)与正前方(Kinect)对人手进行检测,提高了测量精度.
本文针对Kinect 2.0在人手位置检测过程中存在的问题,设计了基于相关点均值处理的人手位置检测算法,选择人手食指的骨骼点为目标,对其周围相关点进行空间平均和时间平均处理,提高人手位置检测精度和稳定性.本文介绍了算法的整体设计以及人手图像分割、手指相关点数据获取、相关点均值处理的实现过程,最后进行了标定实验,验证了该算法的有效性和可行性.
Kinect 2.0可以通过追踪人体骨骼点,获取骨骼点的三维位置数据,但该数据波动性较大,波动范围约在100~130 mm之间,且经过实验发现测量值与实际值存在较大误差[15].因此,为了提高人手位置检测精度,本文进行了基于相关点均值处理的人手位置检测方法的方案设计,方案流程如图1所示.
图1 基于相关点均值处理的人手位置检测方法流程Fig.1 Flow chart of hand position detection based on mean processing of correlation points
为了获得更加准确的人手位置检测数据,首先基于Kinect 2.0获取的深度数据流,进行人手图像分割,然后对通过骨骼点获取的人手位置数据进行处理,将三维位置信息映射到彩色空间,以获取人手骨骼点及其周围像素点在相机空间的索引值,调用索引值得到相关点在相机空间中的位置数据,对数据进行空间平均处理,提高位置数据的准确性.由于直接输出这些数据稳定性较差,所以对经过空间平均处理的位置数据再进行时间上的平均处理,最终得到更加准确和稳定的人手位置信息.
在进行相关点的平均处理前,需要确保所取相关点均属于人手,所以对人体图像进行处理,把属于人手图像的部分从背景中分割出来.在方案设计中采用基于深度阈值分割的方法,该方法主要分为两个部分:图像预处理和深度阈值分割.
1) 图像预处理
图像预处理,可以将人体深度图像从复杂的背景中提取出来.Kinect 除了具有能够获取彩色图像的摄像头外,还有深度红外摄像头和红外发射器.红外发射器会主动向空间发射调制过的红外线激光,当红外线遇到物体后会被反射,反射回来的红外线会被深度摄像头接收,经过运算后得到物体与深度摄像头平面的垂直距离,用该数值作为深度值来生成深度图像.
深度图像每个像素点的深度数据由2个字节、16位组成,高13位代表深度值,低3位代表用户的人体索引值(bodyIndexFrame)信息,最多可同时追踪6个人的深度图像信息.深度值表示了这个像素点到Kinect 2.0传感器深度摄像头所在平面的水平距离,可以识别的深度距离范围在0.5~4.5 m之间.从Kinect 2.0传感器获取的深度图像,可以通过深度值的低3位判断这个像素点是否属于人体.通过调用人体索引值,提取出深度数据帧中属于人体的部分.获取的人体图像信息如图2所示.
图2 人体深度图像信息Fig.2 Depth image of human body
2) 深度阈值分割
考虑到在日常生活中的人手动作交流和应用中,大多数情况下人手是在身体前方的,而人手位置较手腕位置总是相对靠前的,所以本文取手腕处骨骼点的深度值作为阈值进行人手分割,可以取得较好的分割效果.将上一步获取的人体深度信息与该阈值进行比较,如果小于阈值,则判断该像素点属于人手,保留该像素点,若大于阈值,则去除,最后即可得到人手深度图像.
Kinect SDK 2.0为不同坐标系下的图像信息提供了转换方法.为了获取人手彩色图像,可调用坐标映射函数,将深度图像中的像素点映射到彩色图像中对应的像素点,得到人手彩色图像,如图3所示.
图3 人手图像分割Fig.3 Human hand image segmentation
在获取人手骨骼点原始数据的过程中,坐标映射是关键步骤,关系到不同坐标系之间的转换.Kinect坐标系的分类如下:
1)相机空间坐标系(CameraSpace),以Kinect传感器的深度摄像头为原点,其左方为X轴正方向,上方为Y轴正方向,正前方为Z轴正方向,属于右手坐标系.该坐标系是Kinect使用的三维坐标系,输出的骨骼点位置信息则以这个坐标系为基准,输出的原始单位为m.
2)深度空间坐标系(DepthSpace),以深度图像的左上角为原点,用于描述深度图像上像素点的二维位置,用该点的深度值作为像素点的像素值.
3)彩色空间坐标系(ColorSpace),以彩色图像的左上角为原点,用于描述彩色图像上像素点的二维位置,与深度空间坐标系类似.
骨骼点的三维位置坐标属于以深度摄像头为坐标原点的坐标系,与彩色图像的坐标系并不对应,如图4所示.为了使骨架信息与人体彩色图像相对应,需要调用Kinect SDK中的坐标映射函数,将相机三维空间的点转换为彩色空间的点.
图4 Kinect摄像头工作范围示意Fig.4 Working range of Kinect camera
通过坐标映射,可以获取彩色空间中的人手骨骼点在相机空间中的索引值,该索引值是存储三维位置信息数组的下标值,例如:
i=1 920Ycolor+Xcolor.
(1)
上述表达式中的i表示骨骼点在三维位置信息数组中的索引值,Xcolor表示骨骼点三维坐标经过映射后在彩色空间中的X坐标,Ycolor表示骨骼点三维坐标经过映射后在彩色空间中的Y坐标,如图5所示.图5中的每个小方框表示一个像素点,在彩色图像上一共有1 920×1 080个像素点.
图5 骨骼点在彩色空间的映射点Fig.5 Mapping point of skeleton point in color space
除了人手骨骼点的索引值,还可以得到该骨骼点在彩色图像中对应像素点周围相关点的索引值,通过调用这些索引值,可得到相关点的三维位置坐标.
为了提高人手位置检测精度以及稳定性,对通过骨骼点获得的人手位置数据进行空间平均处理和时间平均处理.
对人手骨骼点进行空间平均处理:取人手骨骼点在彩色空间中对应像素点周围的8个点,如图6所示的3×3矩阵,中间的三角形表示目标点,对这9个点的三维位置数据进行空间平均处理,取它们的X、Y、Z三轴的坐标值分别求和,再取其平均值.
图6 空间平均处理所取点的3×3矩阵Fig.6 The 3×3 matrix chosen in spatial average
在空间平均处理的过程中,考虑到所取的8个点可能存在噪声,所以需要对进行空间平均处理的点进行判断,判断该点与中心目标点差值是否大于5 mm,若大于5 mm,则判断该点属于噪声,舍去,若≤5 mm,则进行累加求和,求和结束后,将最后获得的总和除以所取点的个数,得到平均值.这里的5 mm是通过实验评估后选取的.
另外,仅通过空间平均获得的数据稳定性较差.为了提高人手位置检测的稳定性,对空间平均处理得到的三维位置信息再进行时间上的平均处理.Kinect传感器更新图像信息的速度为30帧/s,考虑到输出结果的时效性,每更新5帧数据就进行一次平均处理,将平均处理得到的结果进行输出,得到人手位置信息,实验结果如图7所示.
图7 基于相关点均值处理的人手位置检测方法的输出结果Fig.7 Output of hand position detection algorithm based on mean processing of correlation points
首先在平面上(本实验中以墙为平面)准确画出X、Y坐标轴,如图8所示,精度为1 mm,用来对获取的三维位置信息中的X和Y值进行标定.通过使用激光源,确定了X、Y坐标轴相对于深度摄像头的坐标原点,如图9所示.
图8 精度测量实验中的X、Y坐标轴 Fig.8 X and Y coordinate axes in measuring accuracy experiment
图9 激光源标定坐标原点Fig.9 Coordinate origin calibrated by laser
使用一根测量尺,精度为1 mm,使其与Kinect传感器的深度摄像机保持平行,如图10所示,用来对获取的三维位置信息中的Z值进行标定.
图10 实验中的测量尺Fig.10 Measuring stick used in experiment
在实验中,记录基于骨骼点的位置检测数据、均值化处理后的检测数据和真实的测量数据,计算每组数据的差值和测量精度公式[16]如下:
差值=真实测量数据-Kinect检测数据,
(2)
(3)
式(2)、(3)中的Kinect检测数据包括基于骨骼点的位置检测数据和均值化处理后的检测数据.
实验主要针对人手位置检测获取的X、Y、Z值,所测数据以mm为单位进行输出.计算位置检测数据的测量精度,验证基于相关点均值处理的位置检测方法的有效性.
实验主要分为对X和Y值的数据精度以及对Z值的数据精度进行测量.
对X和Y值的精度测量实验,具体步骤如下:
1)运行程序,打开深度摄像机,让被测者站在标定实验的X、Y坐标轴前,坐标轴精度为1 mm,使手掌平面与墙面贴合,记录初始状态下右手食指的真实位置数据;
2)取步径长度为10 mm,被测者右手食指每移动10 mm记录一次基于骨骼点的位置检测数据、均值化处理后的检测数据和真实的测量数据;
3)由于激光源与Kinect的深度摄像头在Y轴方向上有一定间隔距离,经过测量,对每组真实测量数据加20 mm的修正值;
4)计算每组数据的差值和测量精度,并对计算结果进行分析.
X轴精度测量实验中位置检测数据和真实测量数据如图11所示,测量精度如图12所示.
图11 X轴精度测量实验中位置检测数据和真实测量数据Fig.11 Kinect detected (blue),mean processed Kinect (red) and real (green) position data in X-axis measurement experiment
图12 X轴测量实验的测量精度Fig.12 Comparison of measuring accuracy at X-axis,blue for Kinect detection and red for mean processed Kinect results
Y轴精度测量实验中位置检测数据和真实测量数据如图13所示,测量精度如图14所示.
图13 Y轴精度测量实验中位置检测数据和真实测量数据Fig.13 Kinect detected (blue),mean processed Kinect (red) and real (green) position data in Y-axis measurement experiment
图14 Y轴测量实验的测量精度Fig.14 Comparison of measuring accuracy at Y-axis,blue for Kinect detection and red for mean processed Kinect results
对Z值的精度测量实验,具体步骤如下:
1)运行程序,打开深度摄像机,让被测者站在Kinect传感器前方,初始时被测者手掌平面与Kinect端面保持平行,且距离Kinect端面1 050 mm;
2)取步径长度为10 mm,即被测者手掌平面向Kinect端面每移动10 mm(靠近Kinect方向)记录一次基于骨骼点的位置检测数据、均值化处理后的检测数据和真实的测量数据;
3)由于Kinect端面与深度摄像机有一定间隔距离,经过测量,对每组测量数据加35 mm的修正值;
4)计算每组数据的差值和测量精度,并对结果进行分析.
在标定Z轴的实验中,位置检测数据和真实测量数据如图15所示,测量精度如图16所示.
图15 Z轴精度测量实验中位置检测数据和真实测量数据Fig.15 Kinect detected (blue),mean processed Kinect (red) and real (green) position data in Z-axis measurement experiment
由数据分析可知,经过基于相关点均值处理的位置检测方法的系统实现,人手位置检测精度得到提高,均值处理后读取的位置检测数据与真实测量值十分接近,绝对误差小于5 mm,且最大测量精度不超过0.014 3.由此可以得到结论,在Kinect视野范围内(0.5~4.5 m),基于相关点均值处理的位置检测方法能够提高人手位置检测精度.
基于Kinect 2.0传感器,提出了一种高精度的实时人手位置检测算法.首先,利用Kinect检测原始手指骨骼点,并基于手腕处骨骼点的深度与人体索引值进行人手图像分割;然后,通过Kinect SDK提供的坐标映射函数将人手骨骼点映射到彩色空间坐标系下获取其像素索引值;最后,对获得的人手像素索引值进行空间和时间平均,实现三维工作空间中高精度的人手实时跟踪.实验结果表明,与Kinect 2.0直接获取的人手骨骼点空间位置坐标相比,本文所设计算法的位置检测精度有明显的提高.本文提出的算法可以应用于人机交互领域中,提供更准确的人手位置信息,以实现更为真实、自然的多模态人机交互.