基于手势识别的PPT控制

一直想做一个控制PPT的手势识别软件,想送给自己的老师方便以后讲课的时候可以轻松自在的控制PPT,来自由的讲课,摆脱鼠标的困扰 。所以出发点就这样出来了 。(其实还有进一步的原因,手势控制是将来的一个发展趋势,肢体语言与计算机的交互是一个阶段,冲破这个阶段,虚拟与现实才会很好的结合)如何实施呢?
1、定位手:顺利的找到手,好进行下一步的操作
2、检测手:当然是识别你现在是怎样的手势呀,张开五指?拳头?双手抱拳?
3、程序处理:准确识别了手势,就要根据目前的手势来执行各种命令 。
第一步是基础,只有正确的定位到了手在哪里,才可以更好的进行下一步的操作,就像我PPT中介绍的一样,第一步是金字塔的基础,这一步做好了,下面的才能顺利进行,如果基础打不好,各种错误正在阴险的等着你哦
第二步是核心,手势匹配其实说到实质算是模板的匹配,我现在是做的简单的基于Hu矩的模板匹配,能够更好的摆脱手势上下左右的空间变化,比如你张开手掌是一个命令,但是模板中只有手指冲天的垂直式的,但是你现在水平着伸出手掌怎么样呢,Hu矩可以较好的增加鲁棒性,只要你手势轮廓没有大的变化,基本可以很好的识别 。
第三步So Easy 。呵呵,说简单是相对于PPT的控制来讲的,直接发送一个消息就可以了,比如“开始播放”
[cpp] view plain copy
(VK_F5,0,0,0);//开始播放
一个命令发送一个消息就可以满足你了 。但是如果你想嵌入到游戏中,就像我一样,想把这些命令嵌入到极品飞车中去一样,并不是这么简单的,原因呢?一会给你讲吧
下面是我的主要方法,也许你说简单,也许你说没有品位,但是是我的方法,我讲讲而已,大家可以一起探讨 。

基于手势识别的PPT控制

文章插图
第一步:定位,我是用的HSV色彩空间中对人体皮肤的色彩区间经验值,在中我把经验值设为了
[cpp] view plain copy
=(5,90,120,0); =(23,156,255,0);
这里有必要跟有些新来的童鞋解释下这个区间的问题,大家都知道H的范围是0-360,S的范围是0-1,V的范围是0-1 。在中为了读取的方便和快捷,将这三个值的范围归一化到了另一个范围区间H:0-180,S:0-255, V:0-255,为什么H取180,是为了能够用uchar类型数据存储,这样三个数据类型都是uchar,那么都用八字节就可以搞定了 。做一个跟图像大小相等的灰度图像作为掩码图像,根据这个范围,如果摄像头检测到的图像的HSV范围都在给定的范围中就把值赋为255,如果不在这个范围,那么就是0了 。
得到人体皮肤的一部分后因为有很多的噪声或者别的东西,需要降噪 。我用的是中值滤波,对得到的掩码图像进行滤波 。然后根据掩码图像查找其轮廓,建立轮廓序列的双向链表,这个在里面有现成的函数 。记得好像是,大家可以试试 。
因为我们可以根据某个轮廓得到包含它的某个矩形,那么对这些轮廓我可以按一定的阈值或者自然属性进行筛选,比如1、比较小的轮廓直接删掉,有些轮廓小到根本不可能成下一个手势,那要他何用,2、长宽比太大,当时我做实验的时候后面有个窗帘跟肤色很相近,干扰性很强,后来我想,既然只要手,那么包含手的的轮廓基本是1:1的比例,如果太大或者太小也就不再这个范围内了 。(这里有点需要说明,我的程序没有考虑手臂的干扰,就是手臂也可能包含在内,现在我才去了一个比较有作弊嫌疑的手段:戴手表,这样就可以将手掌和手臂很好的分开了,毕竟我只是完成任务,只要完成就好,请大家不要拍砖,有好的分离方法可以我们讨论)