与计算机之间的另一种沟通方式 ——“手势识别”

手势是无声的语言。人们在生活中借用手势,来表达各种各样的感情。现在,人还可以与计算机之间进行手势互动。

  与人之间的手势互动很容易理解,与计算机之间是怎么实现的呢?

  手势分割

  想要使计算机识别人的手势,首先得将手势从背景中分割出来。因为计算机采集手势信息的同时,也会采集到手势所处的场景信息。

  手势分割通常采用以下几种方法:

  用黑色或白色的墙壁做背景,着深颜色服装,尽可能简化背景。要求人手戴上特殊的手套来强调手部也可,总之在环境上要突出显示手部。

  采集各种手势在各个时刻、不同位置、不同比例的手型图像,作为手势匹配的模板,建立一个庞大的数据库。

  使用边缘检测,将手与背景分离开来。

  手势模型训练

  计算机同人一样,在识别一个手势前,必须先告诉它这个手势是什么,代表什么意思。

  这个过程就是手势建模。模型的选取取决于具体应用,如果要实现自然的人机交互,就必须建立一个精细有效的手势模型,使得识别系统能够对用户所做的绝大多数手势做出正确反应。

  目前,手势建模方法可以归结为两大类:基于表观的手势建模和基于 3D 模型的手势建模。

  基于表观的手势建模是:根据手势的指头数以及指间的夹角不同,对手势进行分类,实现手势在旋转缩放条件下的快速识别。

  基于 3D 模型的手势建模方法是:首先合成人体的 3D 模型,然后改变模型的参数,直到模型和真实人体映射出同样的视觉图像,然后分析身体姿态。

  基于表观特征的手势建模方式比较直观、适应性强、运算速度快。但实际应用中,需要考虑到光线及身体其他部位颜色的影响,这些因素都将直接影响手势区域的提取。

  基于 3D 模型的手势建模识别精度比较高,避免了基于表观特征识别时因遮挡造成的错误识别。虽然 3D 建模技术已经相当成熟,但模型还是太复杂,以至于不能快速地渲染响应。

  因此大多数产品,如 Leap Motion 和 HoloLens 等,都采用了深度图像信息和手势表观特征相结合的方式。这种方式既可以达到基于表观的识别速度,又可以实现基于 3D 的识别精度。

  手势分析

  对手势进行建模后,接下来需要对手势进行分析。手势分析就是估计选定的手势模型参数,这一步一般由特征检测和参数估计组成。在特征检测过程中,必须先确定人手位置。根据所用的线索不同,可以把定位技术分为基于颜色定位、基于运动定位以及多模式定位三种。

  基于颜色定位技术的主要缺点是:在不同的光照条件下皮肤颜色变化较大,并且手和身体颜色相同,当身体其他部位出现在手势背景中,会导致识别错误。解决这一问题的简单方法,就是佩戴一副特殊的手套。

  基于运动的定位技术通常跟某些假设一起使用。例如,假设通常情况下只有一个人在做手势,并且手势者相对于背景的运动量很小,也就是说图像中只有手部是运动的。

  基于多模式定位技术,就是运动和颜色信息的融合定位人手。这种方式效果更加准确,但是计算量会增大。

  匹配

  分析完手势就等于把手势分好了类,接下来只需要将读取到的手势信息,与这些分析结果相匹配,匹配过程就叫手势识别。

  手势识别分为静态手势识别和动态手势识别。静态手势相当于我们检测视力时,对医生做的表明方向手势;动态手势相当于篮球场上裁判员做的一些列手势。

  静态手势识别一般采用模板匹配方法来实现。通过一些相似准则,实时地比较手势与模板库中预定义手势的相似度,从而根据最大相似度来提取出手势模板。

  与静态手势不同,动态手势涉及时间及空间上下文。绝大多数动态手势被建模为手势模型空间里的一条轨迹。不同用户做手势时存在的速率差异、熟练程度等问题,会使运动轨迹与模型轨迹产生较大偏差。

  为了消除这一问题。现有的动态手势识别技术可以分为三类:基于隐马尔科夫模型(Hidden Markow Models,HMM)的识别,基于动态时间规整(Dynamic Time Warping,DTW)的识别,基于压缩时间轴的识别。

  HMM 算法因具有自动分割和分类能力,被广泛应用,以下例子能很好地说明这一算法的原理。

  假设你有一个住得很远的朋友,他每天跟你打电话告诉你他那天做了什么。朋友仅仅对三种活动感兴趣:公园散步、购物以及清理房间。他选择做什么事情只凭天气。

  尽管你对于他所住地方的天气情况并不了解,但是你可以根据他今天所做的事情,来猜测天气情况。这整个系统就是一个隐马尔可夫模型 HMM。

  在这个系统里,你知道的这个地区的天气趋势以及朋友在做的事情,这些就是隐马尔可夫模型里的参数,它们是已知的。而手势可以描述为一系列由方向向量构成的系列,相近向量可以用一个符号来描述。如下图所示:

  我们可以识别手指的位置,然后根据 HMM 模型去猜测轨迹,通过轨迹即可分析手势的意思。

时间: 2024-10-13 11:57:06

与计算机之间的另一种沟通方式 ——“手势识别”的相关文章

项目管理中意见过于统一,也许也是一种沟通问题

项目管理,沟通管理是很重要的一环.沟通管理,很多时候是为了规范沟通的方式,尽量减少由于沟通的方式和渠道导致信息的误传或者延后.有一些项目组借用项目管理系统,已经很好解决了项目沟通管理的及时性的问题,沟通渠道也非常同意,沟通能够做到及时一致.但是,有时候,倘若项目组的意见和思考都非常一致的时候,也许也是一种沟通问题的预兆哦.很多时候,没有思维的撞击得出的结果,很多时候都是比较肤浅的,非常容易出错.为什么这样说呢? 组织中的行为不仅是由个人构成的 ,在很多情况下还表现为各种小群体的行为.为了有效地进

找1~100之间素数的两种比较简单的方法

方法一:利用一个布尔类型的值的判断,优点想法更直接易懂 public static void main(String[] args) { for(int i=2;i<=100;i++){ boolean b=true; for(int n=2;n<i;n++){ if(i%n==0){ b=false; break; } } if(b==true){ System.out.print(i+"\t"); } } } 方法二:能被2和这个数本身以外的数整除的都不是素数.理解难但

IOS开发笔记(2)页面之间传递数据几种方式比较

今天分享一下页面之间传值的几种方式 1.@property属性 这个不用多说了吧,当页面A 跳转到页面B,在class B中声明属性 @property (nonatomic, copy) NSString *name; 初始化B FirstViewController *firstVC = [FirstViewController new]; firstVC.name = @"name"; [self presentViewController:firstVC animated:YE

应用系统之间数据传输的几种方式

如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 随着近年来SOA(面向服务技术架构)的兴起,越来越多的应用系统开始进行分布式的设计和部署.系统由原来单一的技术架构变成面向服务的多系统架构.原来在一个系统之间可以完成的业务流程,通过多系统的之间多次交互来实现.这里不打算介绍如何进行SOA架构的设计,而是介绍一下应用系统之间如何进行数据的传输. 应用系统之间数据传输有三个要素:传输方式,传输协议,数据格式 数据传输方式一般无非是以下几种: 1

简述UIViewControl之间的七种传值方式~~~

将自己学习到的UIViewControl之间传值的几种方式在这里做一下总结,希望童鞋们多多支持哈--- 一.正向传值方式 这种方式传值应该是最简单的方式,我们先来建立两个视图控制器暂且称为OneViewControl和TwoViewControl,然后第一个视图控制器上面有一个UIButton(按钮)和一个UIlabel(标签),第二个控制器中有一个UIButton和一个UITexField(文本框).然后我们在AppDelegate加入如下代码 - (BOOL)application:(UIA

Android中Fragment与Activity之间的交互(两种实现方式)

(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如何创建Fragment混合布局做了详细的分析,今天就来详细说道说道Fragment与宿主Activity之间是如何实现数据交互的. 我们可以这样理解,宿主Activity中的Fragment之间要实现信息交互,就必须通过宿主Activity,Fragment之间是不可能直接实现信息交互的. Fragment与

Mybatis中实体类属性和数据列之间映射的四种办法

http://blog.csdn.net/lmy86263/article/details/53150091 Mybatis不像hibernate中那么自动化,通过@Column注解或者直接使用实体类的属性名作为数据列名,而是需要自己指定实体类属性和 数据表中列名之间的映射关系,这一点让用惯了Hibernate的人很不习惯,所幸经过探索找到了建立映射关系的三种办法,其中总也有比较 简单的. 首先先定义一个实体类,如下: public class User implements Serializa

UIViewControl之间的七种传值方式

将自己学习到的UIViewControl之间传值的几种方式在这里做一下总结,希望童鞋们多多支持哈--- 一.正向传值方式 这种方式传值应该是最简单的方式,我们先来建立两个视图控制器暂且称为OneViewControl和TwoViewControl,然后第一个视图控制器上面有一个UIButton(按钮)和一个UIlabel(标签),第二个控制器中有一个UIButton和一个UITexField(文本框).然后我们在AppDelegate加入如下代码 - (BOOL)application:(UIA

IPC进程之间通信的几种方式

概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件. 除此以外,那就是双方都可以访问的 外设 了.在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息.广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”.因为那些通信手段的效率