3 头部检测
头部定位是本实验的基础。首先确定头部位置可以进一步确定双眼的位置,从而判断双眼之状态。其次通过对头部位置变化的观察,可以判断司机的精神状态,更加准确地对司机进行安全监控。
3.1 预处理
为提供我们做处理所需的数据,需要做一些预处理。在由Kinect采集的深度图像中,所有设备无法测量点的深度值均归为0。我们将其视为噪声。为避免这样的干扰,我们需要恢复它们的真实深度值。我们假设空间是连续的,而丢失点的深度值应该和它们相邻点的深度值相近。在这样的前提下,我们将所有0深度点视为空以便填补。我们采用最近相邻插入算法填补这些空点从而得到一个具有实际意义深度值像素的矩阵。之后我们利用一个4×4窗的中值滤波器平滑这个深度矩阵。
3.2 利用chamfer距离匹配法找到类头区域
本方法第一步是利用嵌入在深度矩阵中的边缘信息来找出头部的候选区域。我们需要一个粗略的检测方法,在此方法中获取一个尽可能低的fn率以及一个相对较高的fp率的扫描结果以便进行下一个环节。我们采用2D chamfer距离匹配法进行快速处理。同时,chamfer距离匹配是一个和大小无关(scale invariant)的2D图形匹配算法,他利用深度矩阵中所有代表物体边界的边缘信息。首先输入一预处理后的二值图像(图1(a)),对输入的深度图像二值化,如图1(b),再采用canny边缘检测算子找出深度图像中的所有边缘(图1(c))。为减小计算量以及周围不规则物体带来的干扰,我们将所有大小小于一个给定阈值的边缘过滤掉。(所谓大小是指边缘所包含的像素点个数)检测结果见图1。
图1 边缘提取过程示意图
我们使用一个二值头部模板(图3(b))和上部得到的边缘图像做匹配。为提高效率,在匹配前需对距离图像做一个距离变换(distance transform)得到它的距离图像(图3(a))。该距离图像是一个256灰度级的灰度图像,其中每个像素值代表该像素到最近边缘点的欧式距离。例如下图
图2 (a)表示一个输入二值图像,(b)为(a)的距离图,其中每个点到最近边缘点距离体现在白色区域内,距离值加平方可以使存储的数据整数化。
图3 距离图和模板
匹配过程是将模板的中心像素点t(x,y)与距离图像d(x,y)中的一像素(i,j)重合,检测t(x,y)和图像重合部分之间的非相似度,对图像中所有的像素都进行这样的操作,通过非相似度为最小或低于某一阈值来确定对象物是否存在,并求得其位置。非相似度计算公式如下:
(1)
这些值越小,说明匹配得越好。如果该值小于一个给定的阈值,则一个“类头”区域就被定位出来。匹配结果如图(4)。
图4 Chamfer匹配结果
之所以说”类头”,是因为这些区域,由于我们所采用较高阈值造成的很低的fn率的缘故,未必是真正的头部。它是否是真正的头部还需下一步进一步确定。
3.3 3D模型的引入
考虑到3D模型的匹配计算量很大,我们希望该模型具有视角不变性(view invariant),这样就免得用不同的模型或者将一个模型扭转到各个角度进行多次使用。这样的模型需要将不同视角的头部特征归一化:前后,左右两边以及当摄像头或者人的位置高低所带来的差异。为了最大程度包容这些差异并且将他们最简化,在这里我们采用一种3D半球模型,如图(5)。 基于Kinect的疲劳驾驶预警(3):http://www.751com.cn/tongxin/lunwen_7607.html