基于手势识别的PPT控制

手势识别 专栏收录该内容
3 篇文章 0 订阅

一直想做一个控制PPT的手势识别软件,想送给自己的老师方便以后讲课的时候可以轻松自在的控制PPT,来自由的讲课,摆脱鼠标的困扰。所以出发点就这样出来了。(其实还有进一步的原因,手势控制是将来的一个发展趋势,肢体语言与计算机的交互是一个阶段,冲破这个阶段,虚拟与现实才会很好的结合)如何实施呢?

1、定位手:顺利的找到手,好进行下一步的操作

2、检测手:当然是识别你现在是怎样的手势呀,张开五指?拳头?双手抱拳?

3、程序处理:准确识别了手势,就要根据目前的手势来执行各种命令。

第一步是基础,只有正确的定位到了手在哪里,才可以更好的进行下一步的操作,就像我PPT中介绍的一样,第一步是金字塔的基础,这一步做好了,下面的才能顺利进行,如果基础打不好,各种错误正在阴险的等着你哦快哭了

第二步是核心,手势匹配其实说到实质算是模板的匹配,我现在是做的简单的基于Hu矩的模板匹配,能够更好的摆脱手势上下左右的空间变化,比如你张开手掌是一个命令,但是模板中只有手指冲天的垂直式的,但是你现在水平着伸出手掌怎么样呢,Hu矩可以较好的增加鲁棒性,只要你手势轮廓没有大的变化,基本可以很好的识别。

第三步So Easy。呵呵,说简单是相对于PPT的控制来讲的,直接发送一个消息就可以了,比如“开始播放”

[cpp]  view plain copy
  1. keybd_event(VK_F5,0,0,0);//开始播放  
一个命令发送一个消息就可以满足你了。但是如果你想嵌入到游戏中,就像我一样,想把这些命令嵌入到极品飞车中去一样,并不是这么简单的,原因呢?一会给你讲吧


下面是我的主要方法,也许你说简单,也许你说没有品位,但是是我的方法,我讲讲而已,大家可以一起探讨。

第一步:定位,我是用的HSV色彩空间中对人体皮肤的色彩区间经验值,在opencv中我把经验值设为了

[cpp]  view plain copy
  1. CvScalar  hsv_min = cvScalar(5, 90, 120, 0);  
  2. CvScalar  hsv_max = cvScalar(23, 156, 255, 0);  
这里有必要跟有些新来的童鞋解释下这个区间的问题,大家都知道H的范围是0-360, S的范围是0-1,V的范围是0-1。在opencv中为了读取的方便和快捷,将这三个值的范围归一化到了另一个范围区间H:0-180,S:0-255, V:0-255,为什么H取180,是为了能够用uchar类型数据存储,这样三个数据类型都是uchar,那么都用八字节就可以搞定了。做一个跟图像大小相等的灰度图像作为掩码图像,根据这个范围,如果摄像头检测到的图像的HSV范围都在给定的范围中就把值赋为255,如果不在这个范围,那么就是0了。


得到人体皮肤的一部分后因为有很多的噪声或者别的东西,需要降噪。我用的是中值滤波,对得到的掩码图像进行滤波。然后根据掩码图像查找其轮廓,建立轮廓序列的双向链表,这个在opencv里面有现成的函数。记得好像是cvFindContours,大家可以试试。

因为我们可以根据某个轮廓得到包含它的某个矩形,那么对这些轮廓我可以按一定的阈值或者自然属性进行筛选,比如1、比较小的轮廓直接删掉,有些轮廓小到根本不可能成下一个手势,那要他何用,2、长宽比太大,当时我做实验的时候后面有个窗帘跟肤色很相近,干扰性很强,后来我想,既然只要手,那么包含手的的轮廓基本是1:1的比例,如果太大或者太小也就不再这个范围内了。(这里有点需要说明,我的程序没有考虑手臂的干扰,就是手臂也可能包含在内,现在我才去了一个比较有作弊嫌疑的手段:戴手表,这样就可以将手掌和手臂很好的分开了,毕竟我只是完成任务,只要完成就好,请大家不要拍砖,有好的分离方法可以我们讨论)


删除掉上面的多余的轮廓以后基本就确定了手的位置,进行下一步操作:手势检测匹配。上面已经介绍过,我采用的是Hu矩的模板匹配方式。具体原理大家参考《学习opencv》中的相关章节吧。


我的程序时为了控制PPT,所以只做了两个模板:张开的手掌还有攥紧的拳头。简单实用,这样匹配效果更好。


第三步:程序控制,得到手势现在的状态以后我们如何操作呢?如何控制PPT呢?我的构思是这样的:

[cpp]  view plain copy
  1. if(检测到手掌并且没有超过5秒钟)  
  2.    继续检测手并作出相应的程序响应;  
  3. else  
  4.    继续检测,直到检测到手掌为止  

这样可以把打开手掌算作一个开关,只有正确检测到手掌并且在一定时间范围内,才打开下面的程序执行,要不然,开关都没有打开,当然就不能执行了。这就需要你在执行程序的时候首先打开手掌让程序打开下面的开关才可以。


具体手势的运动判断,如何作出PPT的响应明天再说吧,实验室要关门了。如果大家感兴趣,可以我们继续讨论,如果觉得那些地方需要改进,欢迎指正,因为是第一次做这一方面,谢谢大家了


因为是简单的做了一个PPT控制程序,包括四个命令:播放PPT(全屏),退出全屏,下一页,上一页。通过上面的介绍可以看出,我设置了一个开关:连续检测到手掌5帧就打开开关,可以进一步接受其他的命令,并且设置了时间,如果打开开关超过5秒钟就会自动关闭,这里设置为5秒钟是因为老师一般一个命令时间很快,关闭命令开关避免界面中其他干扰。


播放PPT命令:如果已经打开了命令开关并且没有超过5秒钟,手掌——》拳头——》手掌。检测到拳头并且没有超过20帧(这里设置成20帧是为退出全屏命令用的)忽然变成了手掌,大家可以这样想:拳头变成手掌,手掌打开就是打开PPT的命令。


退出全屏:打开命令以后,一直是拳头超过20帧就可以认为是关闭PPT命令。


下一页命令:刚开始张开手掌打开命令以后,程序会自动计算手掌的中心位置,如果手掌移动,会实时检测手掌的中心位置,如果手掌的中心位置偏移超过一定的阈值,就可以做下一页或者上一页的命令。


命令执行:PPT的这四个命令可以通过简单的模拟键盘发送消息,“F5”, “ESC”, “->","<-",这个可以通过发送消息函数keybd_event()就可以了,当执行了这个命令以后就立马关闭命令开关,防止比如你移动手的时候会出现连续发送消息造成错误。


具体的执行过程图片稍晚再发给大家吧

界面大家可以看下,比较简陋。开始是命令“CLOSE",检测到手掌以后打开命令开关”OPEN",然后中间显示的时间是命令已经打开的时间。



右边的另一个稍大字体的显示的是攥拳持续了有多少帧。现在设定的是持续20帧左右认为是关闭ppt,下面会显示相应的命令,这个图片你看到的“Close PPT”是上一次程序的执行命令,并不是当前的。



  • 3
    点赞
  • 20
    评论
  • 13
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值