基于嵌入式系统实时交互的手势识别
Typedef struct CvConvexityDefect{
CvPoint* start; / /缺陷开始的轮廓点
CvPoint* end; / /缺陷结束的轮廓点
CvPoint* de pth_point; / /缺陷中距离凸性最远的轮廓点
Float depth; / /谷底距离凸性的深度
} CvConvexityDefect;
如图4 所示,手势轮廓缺陷图能很好地描述各种手势,通过对手势轮廓线外接多边形的边数以及边所对应的谷底深度,可以将手势缺陷图映射到不同的手势。其中A、B、C、D、E、F、G为手势轮廓线的外接多边形的各条边,Da、Db、Dc、Dd、De、Df、Dg为手势缺陷图中的谷底到对应边的深度。
为了得到手势轮廓缺陷图,首先必须对手势轮廓进行多边形拟合,得出它的外接多边形。本文提出了一种根据手势轮廓上相邻两点间的凹凸性来进行拟合,通过一次遍历轮廓上的点,对以下方程进行判定,将适当的点剔除,剩下的点即为外接多边形的候选定点:
by = next y - cur y ( 1)
ay × bx - ax × by ( 2)
ax = pcur. x - pprev. x,ay = pcur. y - pprev. y
bx = pnext. x - pcur. x,by = pnext. y - pcur. y
其中: pcur 为当前遍历的轮廓线上的点; pprev、pnext 分别表示当前点的前一个点和后一个点; ax、ay 分别为当前点和前一点的x 和y 坐标值差; bx、by 分别为当前点和后一点指尖的x 和y坐标值差。
基于轮廓线凹凸形的拟合算法流程如下:
a) 将所有的轮廓线上的点按x 坐标值大小排序,并找出所有的点中y 坐标的最大最小值maxY 和minY.
b) 将排序后的轮廓点划分为四部分: 首先按照y 坐标将轮廓线分为上下两个部分,将上半部分以maxY 所在的x 坐标( 记为Xmaxy) 划分为两个部分,分别记为topLeft〈左上〉和topRight〈右上〉; 将下半部分以minY 所在的x 坐标( 记为Xminy) 划分为两个部分,分别记为bottomLeft〈左下〉和bottom-Right〈右下〉。
c) 分别对前一步划分的四个部分( topLeft, topRight,bottomLeft,bottomRight) 进行遍历: 对区域topLeft 将满足式( 1) 《0,式( 2) > 0 的点剔除; 对区域TopRight 将满足( 1) 0,式( 2)0 的点剔除; 对区域bottomLeft 将满足式式( 1) > 0,式( 2) >0 的点剔除; 对区域bottomRight 将满足式( 1) > 0,式( 2) > 0 的点剔除。剔除后剩下的点即为手势轮廓线外接多边形的顶点。
手势缺陷图的谷底以及谷底深度的求解是建立在拟合外接多边形基础上,还需要对外接多边形的每条边所对应的轮廓线再进行一次遍历,并将满足以下方程的最大值求出即是该边所对应的谷底:
其中: scale 为单位化量值; hull_cur 和hull_next 分别为外接多边形当前遍历的边和下一条边; dx0、dy0分别为外接多边形当前边的x 和y 坐标的差值; dx、dy 分别为当前遍历的轮廓线上的点与hull_cur 点之间x 和y 坐标的差值; depth 为遍历点与对应边之间的距离,它的最大值即为该边对应的谷底深度,相应的点为谷底。
通过以上搜索可以将手势轮廓缺陷图的特征值找出来,接下来便可以将缺陷图的特征值( 多边形与谷底的关系) 与已建立的库中的特征值相比较,对手势进行匹配,将手势轮廓缺陷图映射到不同的手势上去。
2. 1. 2 手势匹配
手势的匹配主要是基于手势缺陷图的匹配,手势缺陷图的特征值由外接多边形以及谷底的位置和深度组成,如图5所示。
根据多边形的边数以及各条边的程度可以确定手指的数量,而谷底的深度和位置可以确定手指的关系和位置。由于这是根据手势的整体图像来进行分析,所以具有一定的鲁棒性,当光线变化而导致手势图出现差别时,并不会导致手势缺陷图的变化。
2. 2 手势跟踪
对于手部跟踪,主要是基于Camshift 算法实现的,它综合利用了手势图像的颜色、区域和轮廓特征。Camshift 是Mean.Shift 算法的推广,是一种有效的统计迭代算法,它使目标点能够漂移到密度函数的局部最大值点。Camshift 跟踪算法是基于颜色概率模型的跟踪方法,在建立被跟踪目标的颜色直方图模型后,可以将视频图像转换为颜色概率分布图,每一帧图像中搜索窗口的位置和尺寸将会被更新,使其能够定位跟踪目标的中心和大小。本文中,Camshift 算法被用于位置的粗定位,即确定当前手势区域的外包矩形Rect,如图6 所示。
Rect 将被用于前一步静态手势识别的输入图像,以便减少对图像的分割以及模糊运算的工作量。
3手势交互演示系统
本文在Linux 系统下实现了本文提出的基于手势轮廓缺陷图进行手势识别的方法,并在“嵌入式之星”开发板上实现了手势识别的人机交互演示系统。系统处理器800 MHz,存储器RAM256 MB,实时采集640 × 480 的真彩色图像。该系统分析摄像头实时捕获到的每一帧图像,对图片中的手势进行实时识别。系统的应用程序是一个基于手势识别的拼图游戏,通过变换手势来完成拼图。可识别的静态手势状态被分为五类: A为握拳、B 为食指伸长、C 为V 型手势、D 为中间三指伸开、E为五指张开。A、E 手型分别对应抓取与松开。手势为握拳状态时,手对应的图片块被选中( 类似鼠标左键按下) ,此时可以拖动图片,选定位置后可以换成手势E,图片将被松开( 类似鼠标左键松开) ,B、C、D 手势分别表示将图片放大、缩小和旋转。
演示系统效果如图7 所示。
4 实验结果及分析
为了检验本文算法的准确性和实时性,本文在实验室光照条件下,采集不带任何特殊标记的手势单目视频图像。实验中参数设置如下: Camshift 算法的最大迭代次数为10; 手势分割使用的HSV 颜色空间如表1 所示。
表1 HSV 颜色空间设置
对手势二值图像所做的数学形态学操作使用3 × 3 的模板做开运算,使用5 × 5 的模板做闭运算; 噪声手势的域值设为0. 01.手势的跟踪过程无人工干预。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论