基于多摄像头的手势识别技术.docx
《基于多摄像头的手势识别技术.docx》由会员分享,可在线阅读,更多相关《基于多摄像头的手势识别技术.docx(24页珍藏版)》请在冰豆网上搜索。
基于多摄像头的手势识别技术
基于多摄像头的手势识别技术研究
1.研究背景
随着计算机硬件与软件技术的发展,人机交互技术由传统的鼠标键盘时代发展到了以语音输入、动作识别等技术为代表的自然交互时代n1。
特别是视觉计算技术的发展,使计算机获得了初步视觉感知的能力,能“看懂”用户的动作。
其中手势识别作为一种直观的、自然的输入方式,把人们从传统接触性的输入装置中解放出来,可以以一种更自然的方式与计算机交互,使计算机界面变得更加易‘引。
手势主要分为静态手势和动态手势两种,动态手势可以看作是连续的静态手势序列。
动态手势具有丰富和直观的表达能力,与静态手势结合在一起,能创造出更丰富的语义。
利用动态手势识别构建新型的交互界面,是新一代的人机交互界面对输入方式自然性的要求,可以弥补传统交互方式的不足。
基于视觉和手势识别研究正处于蓬勃发展的阶段,仍存着的许多值得研究的问题。
研究基于视觉的动态手势识别对于构建更加好友的人机交互界面很有意义。
本文研究的是基于多摄像头的动态手势识别方法,利用两个正交放置的摄像头来获取动态手势的三维运动信息,以支持三维动作的识别。
它是基于两个应用背景的应用研究:
其中一个是利用手势控制的照片浏览,另一个是三维动作感应的拳击小游戏。
作为一个应用研究,在研究的过程中需要解决手势检测、动态手势跟踪中的于脸遮挡、多摄像头协同工作和手势特征提取、动态手势识别等一系问题。
2.手势识别概述
2.1手势识别的概念
手势是姿势的一个子集,姿势这个概念没有精确的定义。
一般认为,手势概念经过人的于转化为的于势动作,观察者看到的是于势动作的图像雎1。
手势的产生过程如图2-1所示。
图2-1手势的产生过程
手势识别的过程则找一个从图像V到概念动作G的变换而,如图2-2所示。
图2-2手势识别的过程
2.2手势识别流程
手势识别流程包手势图像获取、手势分割、手势特征提取、手势识别四大部分嘲,如图2-3所示。
图2-3手势识别流程
3.手势建模
在手势识别框架中,手势模型是一个最基本的部分。
根据不同的应用背景,于势识别采用的模型会有不同,而对于不同的手势模型,采用的手势检测与跟踪算法、特征提取、识别技术也会有差别。
手势建模主要分为基于表观的手势模型与基于三维的于势模型。
基于表观的手势建模是一种二维建模,从二维平面观察得到的平面图像信息描述于的特征。
基于表观的手势模型主要包括基于颜色的模型与基于轮廓的模型两种。
基于颜色的手势模型是把手势图像看作像素颜色的集合,通过提取手部的颜色的特征来描述手势。
基于颜色的手势模型的常用特征是颜色直方图。
基于轮廓的手势模型是把手看作一个轮廓,通过提取手部图像中手的轮廓的几何特征来描述手势。
4.手势检测与跟踪
手势检测与跟踪是手势识别处理流程中最前端的处理部分,它处理从摄像头获取到手势图像(序列),从中检测和分割手势对象。
如果是动态手势识别,还要对手进行跟踪。
基于运动信息的方法:
基于运动信息的方法是假设在视频中只有手是运动物体。
其中一种方法是背景减法。
它要求背景静止不变,把视频中的每帧与背景相减,背景相同的部分变为零,不同的部分就认为是运动的物体,即手。
另一种方法是差帧法,通过当前帧与前一帧(前若干帧)相减,检测出两帧之间的差异来确定手部运动的起始区域。
但是一般相邻帧之间的手势运动幅度不大,差帧法只能检测出运动的轮廓,一般要以比较低的帧采样率或者隔若干帧做减法才能正确检测与分割运动的手部。
5.手势特征提取
手势特征的提取是与手势模型密切相关的,不同的手势模型会有不同有于势
特征。
例如基于模型的手势模型有手的每个关节的状态特征,基于表观模型的手
势特征是轮廓特征、位置特征等。
静态手势识别和动态于势识别的特征也不同,静态手势的特征只是描述的手
的静态信息,例如轮廓、面积等。
动态手势特征是连续的静态特征序列。
5.1静态手势特征
常用的静态手势特征有轮廓、位置、面积、手指分布等。
手的轮廓特征可以连续的点来表示。
通过边缘检测算法,把图像区域的边缘检测出来,经过进行平滑和多边形拟合算法处理,得到多边形的顶点的序列。
在提取于的轮廓比较困难的情况下,或者为了提高计算效率,也可以通过计算轮廓的特征作为手势特征。
例如A.Wilkowski通过以手部图像的外包矩形的边为坐标轴进行投影计算得到轮廓的直方图作为手的轮廓的特征,如图5-1所示。
图5-1手的轮廓特征
手的位置特征是指手掌的质心位置,质心位置可以按公式5-1、公式5-2、公式5-3、公式5-4计算。
手的面积特征通过计算手的轮廓的多边形面积即可。
对于二维图像,质心是通过计算零阶距和x、Y的一阶距得到的。
假设二值化之后的图像为I(x,Y),质心(Xc,Yc)的计算公式如下:
5-1
5-2
5-3
5-4
于指特征的提取是一个关键的技术。
经典的手指提取方法是利用手指距离手掌中心最远这个规律,把于的轮廓点的坐标转换成为以手掌中心位置为原点的极坐标系,然后分析轮廓曲线中的局部最大值(如图5-2所示),最后通过映射规则把点的位置映射为手指。
图5-2轮廓曲线到极坐标的转换
图5-3局部极值法定位手指
5.2动态手势特征
在动态于势中,由于于在空间和时间两个维度是都会发生变化,所以动态手势特征包含于的位置变化和于的形状变化。
手的位置变化可以通过计算手势的当前位置与上一个位置之间和位置偏移量得到。
假设手的运动前后位置为(
)和(
),则可以计算出运动方向的角度
,最后把
进行量化得到对应的方向编码。
图:
5-3手势运动方向编码
通过计算于势运动轨迹相邻点之间位移,得到运动的方向编码,组成手势运动向量特征。
手的形状变化也是一种动态手势特征,这种特征可以简单地由一系列静态手势特征组成。
在有些于势识别研究中,同时考虑手的位置与形状两种变化,同时计算上面的两种特征。
6手势识别
6.1静态手势识别
静态手势识别的方法有很多,例如基于规则的方法、模板匹配的方法、基于机器学习的方法等。
基于规则的识别方法
基于规则的识别方法是最简单的一种识别方法。
它是手工地为手势之间建立关系,定义识别规则睁引。
对于输入的手势特征,按照这些规则判别即可。
基于规则的方法效率很高,缺点是这些规则需要预先硬编码在规则库中。
基于模板匹配的方法
基于模板匹配的方法是采集静态手势作为样本,提取特征作为模板特征库。
在识别时把输入的手势特征与模板库的模板进行匹配。
其中比较经典的使用弹性图匹配(ElasticGraphMatching)方法。
在基于模板的识别方法中比较重要的是定义特征的距离函数。
距离函数需要根据特征的特点来选取的。
张国良、吴江琴、高文等人采用改进的Hausdorff距离来进行手势识别。
Hausdorff距离是用来度量两个集合之间的相似度,它的数学定义如下:
A和B是两个集合,元素个数分别是n和m。
其中
表示元素a和b的距离。
基于机器学习的方法
静态手势识别中,基于机器学习的识别方法比较常用的是人工神经网络(ANN,ArtificialNeuralNetwork)、支持向量机(SVM,SupportVectorMachine)等。
在提取到于势特征之后,直接或者降维之后使用分类器进行分类。
基于机器学习的方法需要预先使用学习样本来训练分类器。
6.2动态手势识别
动态手势是具有时间和空间变化,手势特征量化编码之后成为时间上的符号序列。
目前有许多方法可以对时间序列数据进行分类。
直方图(Histogram)
图像处理领域最基本的直方图技术在某些情况下用于动态手势识别是非常有效的。
直方图能反映手势序列的整体特征。
虽然它丢失了序列的时间特征,但是在一些手势种类少而且运动轨迹区别明显的手势识别应用,不失为一种好选择,它的识别处理效率很高。
例如H.Jet和J.Kim使用直方图对于势运动方向向量进行统计,识别音乐指挥中的四种手势。
动态时间规整(DTlr,DynamicTimeWarping)
经典方法动态时间规整(DTW,DynamicTimeWarping)在语音识别领域应用得很成功。
DTW本质上是一种动态规划算法。
手势识别与语音识别有许多相似
之处,也可以使用DTW算法进行动态手势识别。
有限状态机(FSM,FiniteStateMachine)
有限状态机(FSM,FiniteStateMachine)可以用于动态手势识别。
有限状态机非常适合处理有语言。
动态手势也是一种语言,在为它定义文法之后,有限状态机将是一个有力的处理工具。
例如P.YHong与M.Turk利用有限状态机实现了一个实时的动态手势识别系统瞳引。
隐马尔可夫模型(删,HiddenMarkovModel)
隐马尔可夫模型洲是从马尔可夫(Markov)链的基础上发展的。
马尔可夫链是一个随机过程,而HMM是一个双重随机的过程,其中的状态转移和观察符号都是随机过程。
马尔可夫链中观察值与状态是一一对应的,HMM中状态转移与观察值不是对应的,不能直接观察到状态转移,因此称为隐马尔可犬模型。
HMM是一种概率统计模型,对序列的长短变化适应性比较好,适用于动态时间序列数据的识别。
HMM已经在语音识别领域取得了很大的成功,在手势识别也得到成功的应用。
在现有的动态手势识别研究中,HMM的应用最多。
HMM分为全连接型、左右型、带限制的左右型三类,如图2-4所示。
左右型与全连接形的区别是它在转移概率矩阵增加了一个约束,每个状态只能转移到自己或者它后面的状态。
带限制的左右型HMM是限制每个状态只能转移到自身或者它的下一个状态。
在语音识别和手势识别中,通常是使用带限制的左右型洲。
HMM的定义
HMM是一个三元组名=(
)。
(1)状态的集合S={
..,
),其中N为状态数,用仍表示t时刻的状态。
状态之间的转移是根据转移概率矩阵A决定的。
(2)观察符号的集合O={
...,
),其中M是集中的符号数量。
每个状态输出O是根据观察概率矩阵B决定的。
(3)状态转移概率分布矩阵A=
,其中
,表示从
转移到
的概率。
(4)观察概率矩阵B=
,
,表示状态
观察到
的概率。
(5)初始状态概率分布
,
,
表示初始状态为
的概率。
HMM从一个初始状态开始,每个状态根据观察概率矩阵,输出一个观察符号,然后根据状态转移矩阵,转移到新的状态。
一个具有N个状态数的HMM在一共有
种不同的长度为T状态转移序列,它的状态空间很大的。
HMM具有较强的学习能力。
Forward评估算法
令
=P(
),1<-t≤T,l≤i≤N表示在t时刻为止观察到的符号序
,并且处于状态
。
初始化:
t=T-1,T-2,…,1,1≤i≤N
递推:
,1<-t终止:
1≤i≤N
7基于多摄像头的手势识别
先是手势词汇设计,介绍了在本文研究应用背景下的静态和动态手势设计。
然后是介绍一种基于采样的肤色模型参数初始化方法,通过对采集于部图像样本,自动初始化手部肤色模型、手部面积和脸部面积参数。
在手势跟踪部分,描述了本文提出的基于质心估计手脸遮挡下的手势跟踪方法。
在手势特征提取部分,使用经典的基于轮廓的手指特征提取方法,并且提取运动向量作为动态手势特征。
最后是手势识别部分,静态手势识别采用了基于正交摄像头协作的手势识别策略,动态手势识别则使用一种结合两套独立的隐马尔可夫模型的方法。
本文手势识别的整体流程图如图7-1所示。
图7-1手势识别整体流程
7.1G-Sense系统的手势词汇设计
手势设计是属于交互设计问题。
交互手势的设计主要有四条基本原则,分别是唯一性、自然性、易用性和简单性。
手势根据具体应用场景而设计的,不同应用场景对于势要求差别很大。
譬如有些需要的是二维平面的手势动作,有些需要的是三维空间中的于势动作(如三维虚拟现实、三维动作游戏等)。
静态手势和动态于势也有各自适用的应用场景。
7.2G--Sense手势识别应用
本文研究的基于多摄像头的手势识别系统(G-Sense)是一个使用两个摄像头作为传感器,从两个视角实时捕捉用户的手势动作视频,作为手势识别系统的输入。
在对捕获到的于势进行实时的检测和跟踪、手势特征提取之后,经过手势识别部分的识别得到手势信息,最后把这些手势信息映射为具体应用中的命令,充当着一种输入设备的角色。
本文的基于两个应用情景来研究手势识别系统,分别是照片浏览与拳击小游戏。
在照片浏览应用中,通过三维手势作为输入,实现常见的浏览操作功能,例如“放大照片"、“缩小照片"、“上一张照片”、“下一张照片”、“第一张照片”、“最后一张照片”、“照片顺时针旋转90度”、“照片逆时针旋转90度”等。
在照片浏览应用中,加入了两个有趣的动作:
由后往前伸于的动作,把照片“推”远,缩小照片;由前往后缩予的动作,把照片“拉"回来,放大照片。
在拳击游戏应用中,有3种标准的三维拳击动作,包括“左勾拳”、“右勾拳”、“平直拳”。
7.3G-Sense应用背景下的手势设计
本文研究的手势识别系统有两个功能模式,一个定位模式,另一个是命令控制模式。
本文包含4种静态于势,11种动态手势。
静态手势的定义
图7-2是本文定义的4种静态手势。
其他静态手势被看作无含义的手势。
图7-24种手的静态模式
7.3动态手势的定义
表7-1动态手势的定义
8Sense手势识别系统设计与实现
基于特定的应用背景,本文为了验证提出的手势识别方法的有效性,实现了一个手势识别系统G-Sense。
G-Sense是一个具有手势识别功能的实时人机交互界面软件,可以看作是一种支持手势动作的输入设备。
它提供光标定位与手势动作识别两种功能。
8.2G-Sense系统框架与功能
G-Sense于势识别系统从两个摄头中捕捉用户的手势动作视频,经过手势检测与跟踪、于势特征提取、基于HMM的手势识别等处理流程,把用户的手势动作映射到具体的操作指令。
它的系统框架图如图所示。
图8-1G-Sense手势识别系统
图8-2G-Sense手势识别系统组成
系统的输入是两个摄像头的手势视频,输出是识别出的手势位置和手势命令,如图所示。
其中的手势位置是用于转化为系统光标位置,手势动作映射为应用软件的键盘快捷键。
通过把手势输入转化为系统的标准设备的输入,这种映射处理的优点是可以直接兼容现有的第三方应用软件。
G-Sense系统使用两个普通的摄像头,型号为Unify(环宇飞扬)3900+。
摄像头的视频质量越好噪声越少,处理就会变得越精确。
专业摄像头的成像质量远超过本文使用的这种普通的摄像头。
本文的研究从的实用性角度考虑.采用普通的摄像头进行实验。
由于硬件设备的限制,处理难度会增加。
图8-3是在G-Sense手势识别系统的硬件装置图。
系统使用了两个摄像头,其中一个安装在前方屏幕上方,从前方观察手势动作.另一个安装在底部,从下方观察手势动作。
底部摄像头可以根据具体环境条件,选择安装在顶部。
用户站立在屏幕前方,正对前置摄像头与底置摄像头,与前置摄像头距离大约1.5米。
底部摄像头位置调整为用户的手伸出时的位置的下方即可。
图8-3基于取摄像头的G-Sense手势识别系统碗件装置
8.3G-Sense系统的详细设计
编程实现环境
由于实时的动态手势识别对处理效率要求高.所以本文的G-Sense系统选用C++进行编程实现,界面部分使用MFC。
摄像头视频的实时采集采用了DirectShow。
DirectShow是微软DirectX开发工具中的一部分,合适于视频编程处理。
图像处理部分使用了视觉计算中开源的OpenCV库(openCV20),主要是使用了它的图像数据结构和一些常用见的图像函数,例如读写图像、高斯平滑、图像阈值二值化、查找轮廓等。
系统结构
因为予势识别处理具有典型的“管道一过滤器”型(PipesandFilters)体系结构风格,因此在实现把手势检测跟踪、手势特征提取、静态予势识别、动态手势识别等处理过程封装成类,把前一阶段的处理输出当作后面的处理阶段的输入。
最后在得到于势识别的结果之后,把手势信息映射为相应鼠标和键盘事件。
实时视频处理
为了进行实时的视频捕获,在编程实现中不能使用MFC中的OnTimer事件进行处理,因为它的计时精度是有几十毫秒。
系统中使用MFC中的媒体计时器,以获得1毫秒的计时精度,以支持根据用户自定义的视频帧速率进行捕获。
在初始化计时器时,为其指定回调函数。
在回调函数中,不直进行视频处理,而向主窗口发送一条自定义消息,在消息响应函数实现对视频的捕获和手势识别处理。
因为如果在回调函数中直接处理,如果在系统繁忙的时候,会有大量的函数调用无法及时完成而导致栈溢出。
手部图像采样功能
本文通过于部图像采样手部采样对肤色模型参数、手部和脸部面积参数初始化,以提高系统的适应性。
系统默认是使用常用的肤色参数默认值。
在默认的肤色参数不适用的时候,用户可以启用肤色采样校正功能,以使手势检测和跟踪正常工作。
采样过程的设计如下:
系统会在相应的摄像头画面中显示一个矩形框,用户只需要把手移动到该矩形框,使它完全位于手掌的范围内。
采样使用了延时开始的策略。
用户可以设定延迟采样开始的时间(默认3秒之后)。
当用户按下了采样按钮之后,一个红色的矩形框闪烁出现在摄像头视频预览框中,表示处于准备采样阶段,到了采样开始时间之后,矩形框变为绿色,表示正在采集图像样本,最后矩形框消失,表示采样过程完成,。
在得到采样图像之后,对图像进行统计,自动设置肤色模型的参数。
附录:
1.程序重要部分代码
我们先来明确一些概念,首先,Android的事件处理机制是基于Listener(监听器)来实现的,比我们今天所说的触摸屏相关的事件,就是通过onTouchListener。
其次,所有View的子类都可以通过setOnTouchListener()、setOnKeyListener()等方法来添加对某一类事件的监听器。
第三,Listener一般会以Interface(接口)的方式来提供,其中包含一个或多个abstract(抽象)方法,我们需要实现这些方法来完成onTouch()、onKey()等等的操作。
这样,当我们给某个view设置了事件Listener,并实现了其中的抽象方法以后,程序便可以在特定的事件被dispatch到该view的时候,通过callbakc函数给予适当的响应。
看一个简单的例子,就用最简单的TextView来说明(事实上和ADT中生成的skeleton没有什么区别)。
01.publicclassGestureTestextendsActivityimplementsOnTouchListener{
02.
03. @Override
04. protectedvoidonCreate(BundlesavedInstanceState){
05. super.onCreate(savedInstanceState);
06. setContentView(R.layout.main);
07.
08. //initTextView
09. TextViewtv=(TextView)findViewById(R.id.page);
10. //setOnTouchListeneronTextView
11. tv.setOnTouchListener(this);
12. //showsometext
13. tv.setText(R.string.text);
14. }
15.
16. @Override
17. publicbooleanonTouch(Viewv,MotionEventevent){
18. Toast.makeText(this,"onTouch",Toast.LENGTH_SHORT).show();
19. returnfalse;
20. }
我们给TextView的实例tv设定了一个onTouchListener,因为GestureTest类实现了OnTouchListener接口,所以简单的给一个this作为参数即可。
onTouch方法则是实现了OnTouchListener中的抽象方法,我们只要在这里添加逻辑代码即可在用户触摸屏幕时做出响应,就像我们这里所做的——打出一个提示信息。
这里,我们可以通过MotionEvent的getAction()方法来获取Touch事件的类型,包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,和ACTION_CANCEL。
ACTION_DOWN是指按下触摸屏,ACTION_MOVE是指按下触摸屏后移动受力点,ACTION_UP则是指松开触摸屏,ACTION_CANCEL不会由用户直接触发(所以不在今天的讨论范围,请参考ViewGroup.onInterceptTouchEvent(MotionEvent))。
借助对于用户不同操作的判断,结合getRawX()、getRawY()、getX()和getY()等方法来获取坐标后,我们可以实现诸如拖动某一个按钮,拖动滚动条等功能。
待机可以看看MotionEvent类的文档,另外也可以看考TouchPaint例子。
回到今天所要说的重点,当我们捕捉到Touch操作的时候,如何识别出用户的Gesture?
这里我们需要GestureDetector.OnGestureListener接口的帮助,于是我们的GestureTest类就变成了这个样子。
1.publicclassGestureTestextendsActivityimplementsOnTouchListener,
2. OnGestureListener{
3....
4.}
随后,在onTouch()方法中,我们调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector来分析是否有合适的callback函数来处理用户的手势。
1.@Override
2. publicbooleanonTouch(Viewv,MotionEventevent){
3. //OnGestureListenerwillanalyzesthegivenmotionevent
4. returnmGestureDetector.onTouchEvent(event);
5. }
接下来,我们实现了以下6个抽象方法,其中最有用的当然是onFling()、onScroll()和onLongPress()了。
我已经把每一个方法代表的手势的意思写在了注释里,大家看一下就明白了。
01.//用户轻触触摸屏,由1个MotionEventACTION_DOWN触发
02. @Override
03. publicbooleanonDown(MotionEvente){
04. //TODOAuto-generatedmethodstub
05. Toast.makeText(this,"onDown",Toast.LENGTH_SHORT).s