基于OpenCV的一种手势识别方法
2015-07-02代丽男韩格欣薄纯娟
代丽男 韩格欣 薄纯娟
摘 要:手势识别已发展成为计算机人机交互的一个重要组成部分,稳定、高效的识别系统可将人机交互体验提升到一个新的高度。简要分析了OpenCV计算机视觉库,提出了一种可行的手势识别方法,实现了该算法并验证了其稳定性和效率。
关键词:OpenCV;手势识别;模式识别;图像处理
中图分类号:TP368 文献标识码:B 文章编号:2095-1302(2015)06-00-03
0 引 言
随着科技的日益进步,传统的、基于键盘鼠标的人机交互方式略显单调。各国的研究者们探索着一个又一个新的人机交互方式,而在这些方式中,基于图像理解的方式已经取得了很大的进展。我们的生活离不开肢体动作,而图像方式是计算机能够理解人类动作最直接的方式。图像处理的研究内容非常广泛,配合统计、模式识别等学科知识的应用,我们已经能够识别并理解常用的人类肢体动作。
在肢体动作中,手势动作又是其中的重点。如今很多新的交互方式都建立在手势识别理解的基础上,例如:Microsoft的kinect系统,primesense的生物识别系统等。很多公司已经将其应用到了医疗、教育教学、失语者手势理解等领域。因此,研究手势识别理解将会是未来计算机领域的一大热点。
运动识别系统的进步伴随着数字图像处理领域的进步,各国学者相继开发出了大量优秀的计算机视觉和图像处理软件包。大多数软件包基于计算速度的考虑采用C/C++ 编写[1]。虽然这些软件包对计算机图像处理和计算机视觉的研究提供了很大地便利,但也存在着不足之处[2]:
(1)现行的多数图像处理平台没有提供高级数学函数;
(2)Matlab 的运行速度需要提高并且对宿主机器的配置要求较高;
(3)绝大多数图像处理库不支持嵌入式程序开发。
开源计算机视觉库OpenCV(Open Source Computer Vision Library)的出现极大地弥补了这些不足,给开发者提供了强大的综合开发平台。
1 OpenCV简介
OpenCV(Open Source Computer Vision Library)诞生于Intel 研究中心,是一个开放源代码的、高质量的计算机视觉库。它轻量且高效,采用C/C++ 语言编写,可以运行在Linux/Windows/Mac等操作系统上。OpenCV 还提供了Python、Ruby、Matlab及其他语言的接口[3]。OpenCV中包含了大量经典的计算机视觉处理函数,这些函数涵盖了机器视觉领域的大多数应用。OpenCV提供的视觉处理算法非常丰富,利用其开源特性,只要开发者处理得当,不需要添加新的外部支持也可以支持完整的编译链接生成执行程序。
OpenCV 现行版本为2.4.11.0,已放出了3.0.0的Beta版本。现行版本的OpenCV分为18个模块,其中常用的有8个模块:
(1)Core:定义基本的数据结构,包括矩阵和被其他模块使用的公共函数;
(2)Imgproc:包含线性和非线性图像过滤器、几何图形变化、色彩空间变化等功能;
(3)Video:包含运动分析、背景剪切和对象追踪等功能;
(4)Calib3d:包含多视角集合算法、3D重建等功能;
(5)Features2d:包含特征匹配等功能;
(6)Objdetect:包含预定义对象距离探测等功能;
(7)Highui:包含一个简单易用的高层级接口,用以抽象不同操作系统对视频提取和图像操作的功能;
(8)GPU:包含GPU加速相关的算法,这些算法可以被其他模块使用以加速程序的运转。
2 手势识别简介
根据计算机系统检测手势姿态的传感器的不同,我们可以将手势识别理解系统分为两类:一是利用数据手套获相关技术;二是利用计算机视觉捕获和处理图像流。利用数据手套捕获技术实现的手势识别系统使用不方便,用户需要学习的内容多且使用场景受到限制,而且成本较高[4]。而基于计算机视觉的手势识别系统则具有使用场景广阔、使用习惯符合人体本能、传感器成本低、普及率高等优势。
基于图像的手势识别系统一般可分为手势姿态图像采集、手势姿态图像分割、手势姿态特征提取及手势姿态识别四个步骤[5]。
在大量手势识别系统的实际开发过程中,都牵扯到使用肤色过滤系统来分割获取手势的binary图像。手势姿态的binary图像的获取关系到后期手势姿态理解的稳定性和准确性,但是人体的手部颜色受到个体差异、光源颜色以及光照角度的影响,其中任何一个因素变化都将造成阴影、遮蔽等不良影响[6]。手势识别的方法主要有4种,具体见表1。
表1 手势识别方法静态识别[7] 动态识别[8]
模板匹配法(TM) 动态时间规整法(DTW)
神经网络法(NN) 隐马尔可夫模型法(HMM)
本文首先使用YCrCb肤色分割算法在使用者在线模式下提取使用者手势姿态30组,利用30组手势姿态的均值测量出使用者手部的色彩平均值;然后提取环境光照的平均值、极大值和极小值,利用环境关照的取值和手部均值做运算,特定区域内找点最少的环境光照值和手部均值,最后利用这两个值进行手势姿态图像binary处理。将得到的binary图像进行特征化处理,得到手部特征点,通过对特征点的运算,得到最终的手势姿态理解。
3 手势姿态的binary处理
手势姿态的binary处理核心代码如下:
主函数:
frame = cvQueryFrame(capture);
//读取一帧图像
//cvShowImage( “Main_cam” , frame);
if( !frame ) break;
assert( 0 ==
binary_image_process( frame , mask , high_threshold1 , high_threshold2 , high_threshold3 , &is_get_binary )
);
cvShowImage( “Binary_cam” , mask );
//binary_image_process函数,使用环境光和肤色在线测量均值得到的三个阈值:threshold1,threshold2,threshold3,分别对应YCrCb颜色空间的Y,CR,CB通道:
IplImage* ycrcb = cvCreateImage( cvGetSize(frame) , 8 , 3 );
cvCvtColor( frame , ycrcb , CV_BGR2YCrCb );
for(int i=0 ; i < ycrcb->height ; i++ ) //二值化
{
uchar *row = (uchar *)(ycrcb->imageData) + i * ycrcb->widthStep;
for(int j=0 ; j < ycrcb->width ; j++ )
{
uchar *p = row + 3*j ;
//if( *(p+1) > threshold2 && *(p+2) < threshold3 )//||
if( *(p) < threshold1 )
{
binary_image->imageData[ i * (binary_image->widthStep) + j ] = 255; // 白色
}
else
{
binary_image->imageData[ i * (binary_image->widthStep) + j ] = 0; // 黑色
}
}
}
IplConvKernel *element = cvCreateStructuringElementEx( 4 , 4 , 0 , 0 , CV_SHAPE_RECT );//创建用于腐蚀的核函数
cvErode( binary_image , binary_image , element , 1); // Erotion
cvDilate( binary_image , binary_image , NULL , 1); // Dilation
cvReleaseStructuringElement( &element );
cvReleaseImage( &ycrcb );
经过提取的手势识别binary图形如图1(a)~(e)所示。
可见此方法提取的binary图像清晰准确,具有利用价值,可以为后期的特征提取与识别创造有利条件。
(a) (b)
(c) (d)
(e)
图1 手势识别binary图形
4 手势姿态特征的识别与理解
首先,我们通过对最小包络圆和手腕的计算得出手掌心的位置,然后利用每个点与相邻点做向量外积计算是否为手指尖点和手缝点,最后即可得出手势姿态的全部特征点。
//计算整个轮廓的中心点
for( int i=0 ; i < real_contours_number ; i++ ){
contour_rectangle = cvMinAreaRect2( sort_contours[i] , 0 );
arm_center[i].x = cvRound( contour_rectangle.center.x );
arm_center[i].y = cvRound( contour_rectangle.center.y );
cvCircle( frame , arm_center[i] , 10 , CV_RGB(255,255,255) , -1 , 8 , 0 );
}
//取得凸包,画出指缝
for( int i=0 ; i < real_contours_number ; i++ ){ get_convex_hull( i );
finger_tip( i );
hand( i );
cvClearSeq( hull ); //清空凸包序列
cvClearSeq( defect );
}
最终,得到的含有全部手势特征点的图像如图2(a) 、图2(b)所示。
(a) (b)
图2 含有全部手势特征点的图像
5 结 语
新版本的OpenCV计算机视觉库给我们提供了很强大的计算机视觉处理能力,利用其提供的高级别函数和矩阵运算能力,开发者们可以开发出大量基于图像的应用。利用OpenCV强大的可移植能力,开发者可以使用相应的移植工具将PC平台上的成果转化到移动端,这将会为开发者创造新的机会。
参考文献
[1]喻擎苍, 翁秀娟, 赵匀,等.交互式开放结构计算机视觉平台[J]. 计算机工程与应用,2006,42(23):78-81.
[2]秦小文, 温志芳, 乔维维. 基于OpenCV的图像处理[J]. 电子测试, 2011(7):39-41.
[3]于仕琪, 刘瑞祯. 学习OpenCV( 中文版)[M]. 北京:清华大学出版社,2009.
[4] LEE C, XU Y. Online interactive learning of gestures for human /robot interfaces [C] Proceedings of the 1996 IEEE International Conference on Robotics and Automation. Washington,DC: IEEE Computer Society Press,1996,4: 2982-2987.
[5]赵健, 张冬泉. 基于OpenCV的数字手势识别算法[J]. 计算机应用, 2013, 33(z2):193-196.
[6] SURAL S,QIAN G,PRAMANIK S.Segmentation and histogram generation using the HSV color space for image retrieval[C] of the 2002 International Conference on Image Processing.Piscataway: IEEE,2002: 589 - 592.
[7]郭兴伟,葛元,王林泉.基于形状特征的字母手势的分类及识别算法[J].人工智能及识别技术,2004,30( 18) : 130-132.
[8] LEE H-K,KIM J H. An HMM-based threshold model approach for gesture recognitio[J].IEEE Transactions on Pattern Analysis and Machine Intelligence,1999,21(10):961-973.