【导读】本文是专栏《计算机视觉40例简介》的第7个案例《手势识别》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。 目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。 大家可以在公众号“计算机视觉之光”回复关键字【案例07】获取本文案例的源代码及使用的测试图片等资料。 针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。 |
本文简要介绍书中第7个案例(数字手势识别)的算法原理,关于具体实现,大家可以参考书中第8章手势识别。
在进行数字手势识别时,将手势图中“凹陷区域”(该区域被称为凸缺陷)的个数作为识别的重要依据,如图 1所示:
- 表示数值0、数值1的手势具有0个凹陷区域(不存在凹陷区域);
- 表示数值2的手势具有1个凹陷区域;
- 表示数值3的手势具有2个凹陷区域;
- 表示数值4的手势具有3个凹陷区域;
- 表示数值5的手势具有4个凹陷区域;
图1 手势
从上述分析可以看出,在对表示数字的手势进行识别时,直接计算其中的凹陷区域个数即可识别数字2到数字5。
但是,在凹陷个数为0时,既可能表示数值0也可能表示数值1。因此,此时无法通过凹陷区域的个数来识别手势所表示的数字。这种情况下,就需要应用到凸包的概念。
逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它。凸包跟逼近多边形很像,只不过它是物体最外层的“凸”多边形。凸包指的是完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形。凸包的每一处都是凸的,即在凸包内连接任意两点的直线都在凸包的内部。在凸包内,任意连续三个点所构成的面向内部的角,其角度小于180°。例如,在图 2中,最外层的多边形为机械手的凸包,使用它可以处理手势识别等问题。
图 2 凸包示意图
应用凸包与轮廓的关系即可判断手势0和手势1的差别。如图 3所示,手势0与手势1在以下方面存在着差别:
- 手势0的凸包,与其轮廓基本一致。
- 手势1的凸包,要大于其轮廓值。在手势1的轮廓与凸包之间存在着相对较大的凹陷区域(凸缺陷),凹陷区域面积占比在10%以上。当然,这个10%是个大概值,它因人而异,不是固定值。不同的人手指长度一样,因此该值有一定的波动范围。
图 3 手势0与手势1
根据以上分析,可以简单理解如下:
- 凸包面积 = 凹陷面积 + 轮廓面积
- 针对手势0:轮廓/凹陷面积 > 0.9 (二者基本一致)
- 针对手势1:轮廓/凹陷面积 <= 0.9 (凹陷面积较大,占比超过0.1)
利用二者在上述特征上的区别可以进行手势0和手势1的识别。
当然,其他过程就是简单的图像处理流程了,手势识别的基本流程如图4所示。
图4流程图
手势识别过程如图5所示,能够识别在屏幕内的固定区域的数字手势。
图5 手势识别
在《计算机视觉40例》中,我们使用大概10页的篇幅,从理论基础(获取凸包、凸缺陷、凸缺陷与凸包面积比)、识别过程(识别流程、代码实现)等角度系统深入介绍了数字手势识别的具体算法和实现流程,并对代码实现进行了细致的解释。同时,本章中还介绍了石头剪刀布手势识别的基本原理和实现过程。欢迎大家在《计算机视觉40例——从入门到深度学习(OpenCV-Python)》第8章《手势识别》中获取更详细的内容。
《计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论入门的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面(表情识别、驾驶员疲劳监测、识别性别与年龄等)案例。