OpenCV简易手势识别
Posted 程序媛洋洋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV简易手势识别相关的知识,希望对你有一定的参考价值。
大家好。
节后第一个工作日,天气回暖,加上终于又能写代码了,心情非常棒。下午忙完了手头的事情,CTO不在没法汇报,就寻思着干点什么。想到最近做的一个借助彩色手套的手势识别,简单又有趣,在此分享给大家。不需要机器学习,不需要算法背景,甚至不需要怎么懂OpenCV,就可以做到。
首先我们需要一只易上色的纯色手套,和红、黄、蓝、绿四支水彩笔。手套购于淘宝,一包12双,11元包邮。至于为什么选红黄蓝绿四色,主要是为色度识别的稳定性考虑的。
依照下图上色,或颜色可任意调换:
我们的任务只须识别握拳、张开两种手势,均为正面视角,如下图:
可以看出,两种手势的区别在于手指部分的颜色(绿色、红色)。如果需要进行其他手势的识别,可为手套设计不同的着色方案。
下面开始处理步骤。首先,我们对图像进行9*9的均值滤波,目的是平滑+去噪。这个数字大些无妨,图像模糊一些不影响识别:
接下来,我们要定位到手掌的位置。手掌部分的标识是两条蓝色夹着一块黄色区域,看着不知道像哪国国旗。之所以这样设计,是因为单色很容易在场景中其他地方出现,例如把手掌设置为单色黄色,这时候如果衣服领口、袖口也是黄色的话,程序便无从知晓哪个才是手掌。加上两条蓝色围边,相当于为黄色标识增加了一项特征,以便能准确找到手掌。
对颜色的识别,我在这里用的是色度(chromaticity),是一个二维的点,定义为(r/(r+g+b),g/(r+g+b)),这样可以增加不同光照条件、不同摄像头带来的颜色差异下的鲁棒性。通过为色度的L1欧氏距离设定阈值来进行颜色识别。
我使用了一个简单的区域生长算法来检测整片区域。检测到黄色区域后,再查看它周围区域的像素,如果蓝色像素的总量达到了某个阈值,则将黄色区域的中心标记为手掌。
接着用同样的方法检测图像中红色/绿色的区域。这样的区域,只有在满足某些条件的情况下(我设置的条件为:靠近手掌,且面积大于黄色区域的一半)才有效。根据这一区域的颜色即可判别两种手势。
我已经把源码传到了github上,感兴趣的同学可以下载,也可点击阅读原文查看:
https://github.com/mayl1209/CVprojects/tree/master/glove
以上是关于OpenCV简易手势识别的主要内容,如果未能解决你的问题,请参考以下文章
毕业设计 - 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python