软硬件环境

  • windows 10 64bit

  • anaconda with python 3.7

  • nvidia gtx 1066

  • opencv 4.4.0

基本原理

我们先来看余弦定理,它是检测手指个数的根本原理。下面是一个三角形

opencv_count_fingers

余弦定理表述为,对于任意三角形,任何一边的平方等于其他两边平方的和减去这两边与它们夹角的余弦的积的两倍。用数学公式可以如下图表示

opencv_count_fingers

对应到本文的手指检测,我们手指之间其实也有一个三角形,因此利用余弦定理,就可以计算出2根手指的夹角,如果这个夹角小于90度(正常情况下不可能超出),就可以认为这就是手指了

opencv_count_fingers

代码示例

import numpy as np
import cv2def skinmask(img):''':param img::return:'''# 从BGR转换成HSV,即色调、饱和度、明度# HSV(Hue、Saturation、Value)基本颜色分量范围,可以参考 https://image.xugaoxiang.com/imgs/2020/12/a3cceeb4f7c9ea2f.jpghsvim = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 颜色范围下边界lower = np.array([0, 48, 80], dtype="uint8")# 颜色范围上边界upper = np.array([20, 255, 255], dtype="uint8")# 检查数组元素是否位于另外两个数组的元素之间,指定范围内的图像显示为白色,相反为黑色skinRegionHSV = cv2.inRange(hsvim, lower, upper)# 均值滤波,核大小2*2blurred = cv2.blur(skinRegionHSV, (2, 2))# 阈值处理,阈值为0,填充色为255,小于阈值的像素点置0,大于阈值的像素点置填255ret, thresh = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY)return threshdef getcnthull(mask_img):# 找轮廓contours, hierarchy = cv2.findContours(mask_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours = max(contours, key=lambda x: cv2.contourArea(x))# 找凸包hull = cv2.convexHull(contours)return contours, hulldef getdefects(contours):# 找凸包,returnPoints=Falsehull = cv2.convexHull(contours, returnPoints=False)# 找凸缺陷,也就是我们手指打开时,2指之间凹的部分defects = cv2.convexityDefects(contours, hull)return defectsif __name__ == '__main__':# 读取摄像头数据cap = cv2.VideoCapture(0)while cap.isOpened():_, img = cap.read()try:mask_img = skinmask(img)contours, hull = getcnthull(mask_img)# 画轮廓cv2.drawContours(img, [contours], -1, (255, 255, 0), 2)cv2.drawContours(img, [hull], -1, (0, 255, 255), 2)# 轮廓线为convexity hull, 而convexity hull与手掌之间的部分为convexity defects。每个convexity defect区域有四个特征量:起始点(startPoint),结束点(endPoint),距离convexity hull最远点(farPoint),最远点到convexity hull的距离(depth)。defects = getdefects(contours)if defects is not None:cnt = 0for i in range(defects.shape[0]):s, e, f, d = defects[i][0]start = tuple(contours[s][0])end = tuple(contours[e][0])far = tuple(contours[f][0])# 得到三角形3条边的长度a = np.sqrt((end[0] - start[0]) ** 2 + (end[1] - start[1]) ** 2)b = np.sqrt((far[0] - start[0]) ** 2 + (far[1] - start[1]) ** 2)c = np.sqrt((end[0] - far[0]) ** 2 + (end[1] - far[1]) ** 2)# 使用余弦定理计算角度angle = np.arccos((b ** 2 + c ** 2 - a ** 2) / (2 * b * c))# 如果角度小于90度,则认为是手指if angle <= np.pi / 2:cnt += 1cv2.circle(img, far, 4, [0, 0, 255], -1)if cnt > 0:cnt = cnt + 1# 显示手指个数cv2.putText(img, str(cnt), (0, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)cv2.imshow("img", img)except:passif cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()

执行上述代码,可以得到

opencv_count_fingers

OpenCV检测手指个数相关推荐

  1. 基于OpenCV的手指只数检测

    提示:本项目是由微信公众号:小白学视觉,中Opencv视觉实战项目里为源文,等下也会分享链接.有兴趣的小伙伴们可以关注哦,里面还有很多的基础视觉项目,我个人觉得还是很有意思的. 文章目录 前言 一.手 ...

  2. opencv检测矩形

    参考:使用OpenCV检测图像中的矩形_知来者逆的博客-CSDN博客_opencv检测图像中的矩形 1.得到原始图像之后,代码处理的步骤是: (1)滤波增强边缘. (2)分离图像通道,并检测边缘. ( ...

  3. 指尖检测 手掌检测 手指弯曲程度检测

    任务:得到手指的弯曲程度,进行评级(仅仅根据二维图像). 方法:检测手指指尖,方法是首先阈值分割后检测指尖的曲率,找到符合要求的点,然后聚类,找出符合要求的在指尖上的点,最后得到指尖,得到指尖后,根据 ...

  4. 使用Python,OpenCV检测摄像机到标记对象的距离

    使用Python,OpenCV检测摄像机到标记对象的距离 1. 效果图 2. 三角形相似性是什么? 3. 三角形相似性检测距离原理 4. 使用Python,OpenCV检测标记对象 5. 源码 参考 ...

  5. 使用Python和OpenCV检测图像中的条形码

    使用Python和OpenCV检测图像中的条形码 1. 效果图 2. 算法的步骤 3. 源码 参考 这篇博客将介绍使用计算机视觉和图像处理技术进行条形码检测的必要步骤,并演示使用Python编程语言和 ...

  6. OpenCV检测图像轮廓

    轮廓只不过是图像中连接的曲线,或者图像中连通部分的边界,轮廓通常以图像中的边缘来计算,但是,边缘和轮廓的区别在于轮廓是闭合的,而边缘可以是任意的.边缘的概念局限于点及其邻域像素,轮廓将目标作为整体进行 ...

  7. python opencv 检测特定颜色

    python opencv 检测特定颜色 import cv2 import numpy as npcap = cv2.VideoCapture(0)# set blue thresh 设置HSV中蓝 ...

  8. python opencv检测人脸

    python opencv检测人脸 文章目录: 一.opencv检测一张图片 二.opencv摄像头实时检测人脸 一.opencv检测一张图片 opencv检测人脸分成三部分: 1.图片转换成灰色(降 ...

  9. 使用Python和OpenCV检测图片上的条形码

    这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问题,浏览代码之后,我提供了一些对原始算法的更新和改进. 首先需 ...

最新文章

  1. 20分钟教你搞懂Git!
  2. linux系统安装柯美打印机,柯尼卡美能达复印机中标麒麟系统驱动安装
  3. 完整的url以及同源跨域处理
  4. 据说这份高考卷,只有程序员能得满分!
  5. QT Windows下生成动态链接库
  6. 软件测试工程师笔试总结
  7. 诗与远方:无题(六十四)- 杂诗
  8. 前端工程师凭什么这么值钱?
  9. 「管理数学基础」4.2 模糊数学:扩张原理、模糊数、可能性分布与模糊概率
  10. 工具答疑---beyond compar文件无法编辑
  11. 测试:如何测试微信朋友圈的点赞功能
  12. 【功能】:前台上传文件(txt,xls,xlsx,csv,pdf)五种格式的文件 后台java解析文件,并且判断文件内容是否为零字节
  13. 某计算机内存容量8GB,按字编址,每个字包括2字节,需要多少根地址线?
  14. 【ROM定制】Android 12 制作『MIUI官改』那点事③工具
  15. 用php求两数之和,Leetcode PHP 两数之和
  16. 二叉树的前序,中序,后续(非递归版本)
  17. RHCE 第五次作业
  18. 测试小故事6:术业有专攻
  19. HTML中上传与读取图片或文件(input file)----在路上(25)
  20. 51单片机(汇编语言)实现十进制转十六进制

热门文章

  1. 中控智慧身份证读卡器工具类
  2. Honor笔记本 (2018款intel版本)win11升级教程(TPM2.0)
  3. Python基于OpenCV的实时疲劳检测[源码&演示视频&部署教程]
  4. 花卉拍摄技巧 8 — 荷莲
  5. dms3.0 mysql_DMS 3.0 导入数据库出错-问答-阿里云开发者社区-阿里云
  6. Python:二次曲线拟合(节约生命法拟合)
  7. 解决echarts饼图label显示不全的问题
  8. 使用Kubeadm快速部署K8S集群
  9. 计算机视觉-语义分割论文总结
  10. 新一代开源免费的轻量级 SSH 终端,非常炫酷好用