导读】本文是专栏《计算机视觉40例简介》的第7个案例《手势识别》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。

目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。

大家可以在公众号“计算机视觉之光”回复关键字【案例07】获取本文案例的源代码及使用的测试图片等资料。

针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。

本文简要介绍书中第7个案例(数字手势识别)的算法原理,关于具体实现,大家可以参考书中第8章手势识别。

在进行数字手势识别时,将手势图中“凹陷区域”(该区域被称为凸缺陷)的个数作为识别的重要依据,如图 1所示:

  1. 表示数值0、数值1的手势具有0个凹陷区域(不存在凹陷区域);
  2. 表示数值2的手势具有1个凹陷区域;
  3. 表示数值3的手势具有2个凹陷区域;
  4. 表示数值4的手势具有3个凹陷区域;
  5. 表示数值5的手势具有4个凹陷区域;

图1 手势

从上述分析可以看出,在对表示数字的手势进行识别时,直接计算其中的凹陷区域个数即可识别数字2到数字5。

但是,在凹陷个数为0时,既可能表示数值0也可能表示数值1。因此,此时无法通过凹陷区域的个数来识别手势所表示的数字。这种情况下,就需要应用到凸包的概念。

逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它。凸包跟逼近多边形很像,只不过它是物体最外层的“凸”多边形。凸包指的是完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形。凸包的每一处都是凸的,即在凸包内连接任意两点的直线都在凸包的内部。在凸包内,任意连续三个点所构成的面向内部的角,其角度小于180°。例如,在图 2中,最外层的多边形为机械手的凸包,使用它可以处理手势识别等问题。

图 2  凸包示意图

应用凸包与轮廓的关系即可判断手势0和手势1的差别。如图 3所示,手势0与手势1在以下方面存在着差别:

  1. 手势0的凸包,与其轮廓基本一致。
  2. 手势1的凸包,要大于其轮廓值。在手势1的轮廓与凸包之间存在着相对较大的凹陷区域(凸缺陷),凹陷区域面积占比在10%以上。当然,这个10%是个大概值,它因人而异,不是固定值。不同的人手指长度一样,因此该值有一定的波动范围。

图 3 手势0与手势1

根据以上分析,可以简单理解如下:

  1. 凸包面积 = 凹陷面积 + 轮廓面积
  2. 针对手势0:轮廓/凹陷面积 > 0.9 (二者基本一致)
  3. 针对手势1:轮廓/凹陷面积 <= 0.9 (凹陷面积较大,占比超过0.1)

利用二者在上述特征上的区别可以进行手势0和手势1的识别。

当然,其他过程就是简单的图像处理流程了,手势识别的基本流程如图4所示。

图4流程图

手势识别过程如图5所示,能够识别在屏幕内的固定区域的数字手势。

图5 手势识别

在《计算机视觉40例》中,我们使用大概10页的篇幅,从理论基础(获取凸包、凸缺陷、凸缺陷与凸包面积比)、识别过程(识别流程、代码实现)等角度系统深入介绍了数字手势识别的具体算法和实现流程,并对代码实现进行了细致的解释。同时,本章中还介绍了石头剪刀布手势识别的基本原理和实现过程。欢迎大家在《计算机视觉40例——从入门到深度学习(OpenCV-Python)》第8章《手势识别》中获取更详细的内容。

《计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论入门的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面(表情识别、驾驶员疲劳监测、识别性别与年龄等)案例。

【计算机视觉40例】案例07:数字手势识别相关推荐

  1. 【计算机视觉40例】案例08:石头剪刀布手势识别

    [导读]本文是专栏<计算机视觉40例简介>的第8个案例<石头剪刀布手势识别>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python) ...

  2. 【计算机视觉40例】案例36:调用CNN实现人脸检测

    [导读]本文是专栏<计算机视觉40例简介>的第36个案例<调用CNN实现人脸检测>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Pyth ...

  3. 【计算机视觉40例】案例40:识别性别与年龄

    [导读]本文是专栏<计算机视觉40例简介>的第40个案例<识别性别与年龄>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python)& ...

  4. 【计算机视觉40例】案例05:物体计数

    [导读]本文是专栏<计算机视觉40例简介>的第5个案例<物体计数>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python)>一 ...

  5. 【计算机视觉40例】案例30:EigenFaces人脸识别

    [导读]本文是专栏<计算机视觉40例简介>的第30个案例<EigenFaces人脸识别>的简介,该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenC ...

  6. 【计算机视觉40例】案例26:姿势识别

    [导读]本文是专栏<计算机视觉40例简介>的第26个案例<姿势识别>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python)> ...

  7. 【计算机视觉40例】案例03:数字水印

    [导读]本文是专栏<计算机视觉40例简介>的第3个案例<数字水印>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python)>一 ...

  8. 【计算机视觉40例】案例19:行人检测

    [导读]本文是专栏<计算机视觉40例简介>的第19个案例<行人检测>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python)> ...

  9. 【计算机视觉40例】案例29:LBPH人脸识别

    [导读]本文是专栏<计算机视觉40例简介>的第29个案例<LBPH人脸识别>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python) ...

最新文章

  1. Redis--发布订阅模式
  2. swift 设计模式之-责任链模式
  3. js 操作vuex数据_Vue.js中使用Vuex实现组件数据共享案例
  4. Git之第三方托管oschina
  5. java new对象 =null_在Java中将对象分配为null会影响垃圾回收吗?
  6. STM32 - 定时器的设定 - 基础 01 - Timer Base - Prescaler description - Upcounting mode
  7. 小米再回应造车传闻:一直关注,还没正式立项
  8. DDNS及端口映射简介
  9. centos7安装redies
  10. 360随身wifi无线网卡linux,360随身wifi2代驱动,当usb无线网卡使用
  11. 记一次feign调用报错:feign.codec.DecodeException: Error while extracting response for type [java...
  12. APICloud平台常用技术点汇总详解
  13. pytracking的kys报错spatial_correlation_sampler_backend.cpython-37m-x86_64-linux-gnu.so: undefined symbo
  14. unity 关于使用Rigidbody的Addforce但不起作用的一些可能原因以及解决方法
  15. http与https与其他
  16. python二维码生成识别代码_Python3+qrcode+zxing生成和识别二维码教程
  17. DSP_1 环境搭建
  18. php基地论坛,中国原创歌词基地论坛 - 最大的原创歌词社区
  19. 图片镜像水平翻转,垂直翻转以及顺时针,逆时针旋转
  20. 解决Pandas的to_excel()写入不同Sheet,而不会被重写

热门文章

  1. Java、JSP基于JAVAEE的食堂管理系统
  2. 数学建模 2013B碎纸片的拼接复原
  3. 2023年淘宝天猫京东618活动时间安排和活动攻略
  4. SSM源码分析之Spring11-手写SpringORM
  5. 树莓派升级HP LaserJet M1005为网络打印机
  6. k8s强制删除namespace
  7. 【资源下载】动手为王 - 整合迁移与数据恢复实践
  8. 零基础小白自学编程选哪种语言好?告诉你世上最好编程语言推荐
  9. 全面系统讲解 淘宝开放平台
  10. Hadoop 深入浅出 ---- 入门 (1)