大创项目推荐 深度学习手势检测与识别算法 - opencv python

news2025/1/11 11:36:56

文章目录

  • 0 前言
  • 1 实现效果
  • 2 技术原理
    • 2.1 手部检测
      • 2.1.1 基于肤色空间的手势检测方法
      • 2.1.2 基于运动的手势检测方法
      • 2.1.3 基于边缘的手势检测方法
      • 2.1.4 基于模板的手势检测方法
      • 2.1.5 基于机器学习的手势检测方法
    • 3 手部识别
      • 3.1 SSD网络
      • 3.2 数据集
      • 3.3 最终改进的网络结构
  • 4 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 深度学习图像识别手势检测识别系统

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 实现效果

废话不多说,先看看学长实现的效果吧
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 技术原理

2.1 手部检测

主流的手势分割方法主要分为静态手势分割和动态手势分割两大类方法。

  • 静态手势分割方法: 单张图片利用手和背景的差异进行分割,

  • 动态手势分割方法: 利用了视频帧序列的信息来分割。

2.1.1 基于肤色空间的手势检测方法

肤色是手和其他背景最明显的区分特征,手的颜色范围较统一并且有聚类性,基于肤色的分割方法还有处理速度快,对旋转、局部遮挡、姿势变换具有不变性,因此利用不同的颜色空间来进行手势分割是现在最常用的方法。

肤色分割的方法主要有以下几种:基于参数、非参数的显式肤色聚类方法。参数模型使用高斯颜色分布,非参数模型则是从训练数据中获得肤色直方图来对肤色区间进行估计。肤色聚类显式地在某个特定的颜色空间中定义了肤色的边界,广义上看是一种静态的肤色滤波器,如Khan根据检测到的脸部提出了一种自适应的肤色模型。

肤色是一种低级的特征,对计算的消耗很少,感知上均匀的颜色空间如CIELAB,CIELUV等已经被用于进行肤色检测。正交的颜色空间如,YCbCr,YCgCr,YIQ,YUV等也被用与肤色分割,如Julilian等使用YCrCb颜色空间,利用其中的CrCb分量来建立高斯模型进行分割。使用肤色分割的问题是误检率非常高,所以需要通过颜色校正,图像归一化等操作来降低外界的干扰,提高分割的准确率。

基于YCrCb颜色空间Cr, Cb范围筛选法手部检测,实现代码如下:

# 肤色检测之二: YCrCb中 140<=Cr<=175 100<=Cb<=120
img = cv2.imread(imname, cv2.IMREAD_COLOR)
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 把图像转换到YUV色域
(y, cr, cb) = cv2.split(ycrcb) # 图像分割, 分别获取y, cr, br通道分量图像

skin2 = np.zeros(cr.shape, dtype=np.uint8) # 根据源图像的大小创建一个全0的矩阵,用于保存图像数据
(x, y) = cr.shape # 获取源图像数据的长和宽

# 遍历图像, 判断Cr和Br通道的数值, 如果在指定范围中, 则置把新图像的点设为255,否则设为0
for i in  range(0, x): 
	for j in  range(0, y):
		if (cr[i][j] >  140) and (cr[i][j] <  175) and (cb[i][j] >  100) and (cb[i][j] <  120):
			skin2[i][j] =  255
		else:
			skin2[i][j] =  0

cv2.imshow(imname, img)
cv2.imshow(imname +  " Skin2 Cr+Cb", skin2)

检测效果:

在这里插入图片描述
在这里插入图片描述

2.1.2 基于运动的手势检测方法

基于运动的手势分割方法将运动的前景和静止的背景分割开,主要有背景差分法、帧间差分法、光流法等。

帧间差分选取视频流中前后相邻的帧进行差分,设定一定的阈值来区分前景和后景,从而提取目标物体。帧差法原理简单,计算方便且迅速,但是当前后景颜色相同时检测目标会不完整,静止目标则无法检测。

背景差分需要建立背景图,利用当前帧和背景图做差分,从而分离出前后景。背景差分在进行目标检测中使用较多。有基于单高斯模型,双高斯模型的背景差分,核密度估计法等。景差分能很好的提取完整的目标,但是受环境变化的影响比较大,因此需要建立稳定可靠的背景模型和有效的背景更新方法。

1, 读取摄像头
2, 背景减除
fgbg1 = cv.createBackgroundSubtractorMOG2(detectShadows=True)
fgbg2 = cv.createBackgroundSubtractorKNN(detectShadows=True)
# fgmask = fgbg1.apply(frame)
fgmask = fgbg2.apply(frame) # 两种方法
3, 将没帧图像转化为灰度图像 在高斯去噪 最后图像二值化
gray = cv.cvtColor(res, cv.COLOR_BGR2GRAY)
blur = cv.GaussianBlur(gray, (11, 11), 0)
ret, binary = cv.threshold(blur, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
4, 选取手部的 ROI 区域 绘制轮廓
gesture = dst[50:600, 400:700]
contours, heriachy = cv.findContours(gesture, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # 获取轮廓本身
for i, contour in enumerate(contours): # 获取轮廓
cv.drawContours(frame, contours, i, (0, 0, 255), -1) # 绘制轮廓
print(i)

在这里插入图片描述

2.1.3 基于边缘的手势检测方法

基于边缘的手势分割方法利用边缘检测算子在图像中计算出图像的轮廓,常用来进行边缘检测的一阶算子有(Roberts算子,Prewitt算子,Sobel算子,Canny算子等),二阶算子则有(Marr-
Hildreth算子,Laplacian算子等),这些算子在图像中找到手的边缘。但是边缘检测对噪声比较敏感,因此精确度往往不高。

边缘检测代码示例:

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import scipy.signal as signal     # 导入sicpy的signal模块

# Laplace算子
suanzi1 = np.array([[0, 1, 0],  
                    [1,-4, 1],
                    [0, 1, 0]])

# Laplace扩展算子
suanzi2 = np.array([[1, 1, 1],
                    [1,-8, 1],
                    [1, 1, 1]])

# 打开图像并转化成灰度图像
image = Image.open("pika.jpg").convert("L")
image_array = np.array(image)

# 利用signal的convolve计算卷积
image_suanzi1 = signal.convolve2d(image_array,suanzi1,mode="same")
image_suanzi2 = signal.convolve2d(image_array,suanzi2,mode="same")

# 将卷积结果转化成0~255
image_suanzi1 = (image_suanzi1/float(image_suanzi1.max()))*255
image_suanzi2 = (image_suanzi2/float(image_suanzi2.max()))*255

# 为了使看清边缘检测结果,将大于灰度平均值的灰度变成255(白色)
image_suanzi1[image_suanzi1>image_suanzi1.mean()] = 255
image_suanzi2[image_suanzi2>image_suanzi2.mean()] = 255

# 显示图像
plt.subplot(2,1,1)
plt.imshow(image_array,cmap=cm.gray)
plt.axis("off")
plt.subplot(2,2,3)
plt.imshow(image_suanzi1,cmap=cm.gray)
plt.axis("off")
plt.subplot(2,2,4)
plt.imshow(image_suanzi2,cmap=cm.gray)
plt.axis("off")
plt.show()

2.1.4 基于模板的手势检测方法

基于模版的手势分割方法需要建立手势模版数据库,数据库记录了不同手势不同场景下的手势模版。计算某个图像块和数据库中各个手势的距离,然后使用滑动窗遍历整幅图像进行相同的计算,从而在图像正确的位置找到数据库中的最佳匹配。模版匹配对环境和噪声鲁棒,但是数据库需要涵盖各种手型、大小、位置、角度的手势,并且因为需要遍历整个图像进行相同的计算,实时性较差。

2.1.5 基于机器学习的手势检测方法

贝叶斯网络,聚类分析,高斯分类器等等也被用来做基于肤色的分割。随机森林是一种集成的分类器,易于训练并且准确率较高,被用在分割和手势识别上。建立肤色分类的模型,并且使用随机森林对像素进行分类,发现随机森林得到的分割结果比上述的方法都要准确.

3 手部识别

毫无疑问,深度学习做图像识别在准确度上拥有天然的优势,对手势的识别使用深度学习卷积网络算法效果是非常优秀的。

3.1 SSD网络

SSD网络是2016年提出的卷积神经网络,其在物体检测上取得了很好的效果。SSD网络和FCN网络一样,最终的预测结果利用了不同尺度的特征图信息,在不同尺度的特征图上进行检测,大的特征图可以检测小物体,小特征图检测大物体,使用金字塔结构的特征图,从而实现多尺度的检测。网络会对每个检测到物体的检测框进行打分,得到框中物体所属的类别,并且调整边框的比例和位置以适应对象的形状。

在这里插入图片描述

3.2 数据集

我们实验室自己采集的数据集:

数据集包含了48个手势视频,这些视频是由谷歌眼镜拍摄的,视频中以第一人称视角拍摄了室内室外的多人互动。数据集中包含4个类别的手势:自己的左右手,其他人的左右手。数据集中包含了高质量、像素级别标注的分割数据集和检测框标注数据集,视频中手不受到任何约束,包括了搭积木,下棋,猜谜等活动。

在这里插入图片描述

需要数据集的同学可以联系学长获取

3.3 最终改进的网络结构

在这里插入图片描述
在这里插入图片描述

最后整体实现效果还是不错的:
在这里插入图片描述

4 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1373450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS14 Widget 小组件调研

桌面小组件是iOS14推出的一种新的桌面内容展现形式。 根据苹果的统计数据&#xff0c;“一般用户每天进入主屏幕的次数超过90次”&#xff0c;如果有一个我们应用的小组件在桌面&#xff0c;每天都有超过90次曝光在用户眼前的机会&#xff0c;这绝对是一个顶级的流量入口。 “…

LCD—液晶显示中英文

本节主要介绍以下内容&#xff1a; 字符编码 字模 各种模式的液晶显示字符实验 本节字符编码说明参考网站 字符编码及转换测试&#xff1a;导航菜单 - 千千秀字 Unicode官网&#xff1a;http://www.unicode.org。 一、字符编码 由于计算机只能识别0和1&#xff0c;文字…

TensorFlow相关组件的安装

安装Anaconda3 安装Anaconda3的时候可以安装在任意磁盘中&#xff0c;在勾选path的时候全部勾选即可。更换Anaconda3的下载源为清华大学源&#xff0c;在此期间不要打开Anaconda3&#xff0c;在cmd中依次输入以下即可&#xff1a; conda config --add channels https://mirro…

基于TI TPSXX系列 Buck电路应用计算-外围器件详细计算过程

TPS54202 Buck电路应用计算 1、电气特性2、内部框图3、典型应用电路4、设计需求5、计算EN引脚电阻6、FB引脚电阻估算7、查看反馈电压电压基准8、输入电容计算10、FB引脚反馈电阻计算11、功率电感计算12、输出电容计算13、前馈电容计算15、Layout布局 TPS54202-中文版 1、电气特…

软件测试|详解 Pytest 参数化:简化测试用例的编写

简介 Pytest 是一个广泛使用的 Python 测试框架&#xff0c;它提供了丰富的功能来编写和执行测试用例。其中一个强大的特性是参数化&#xff0c;它允许我们通过一种简洁的方式运行多个输入参数的相似测试用例&#xff0c;从而减少冗余的代码。本文将详细介绍 Pytest 的参数化功…

招投标系统是Electron的纯内网编辑Office Word,可以设置部分区域可编辑,其他的地方不能编辑吗?

问题&#xff1a; 我们是招投标系统的开发公司&#xff0c;框架是用的Electron&#xff0c;需要在纯内网的环境下编辑Office Word&#xff0c;可以设置部分区域可编辑&#xff0c;其他的地方不能编辑吗&#xff08;如下红框位置&#xff09;并且在用户忘记填写一些区域的时候做…

linux kernel:devres模块架构分析

参考文档&#xff1a; https://www.kernel.org/doc/html/latest/driver-api/driver-model/devres.html https://www.cnblogs.com/sammei/p/3498052.html devres in linux driver devres: Managed Device Resource device resource managementdevres_alloc()动态申请内存分配…

【Python】编程练习的解密与实战(二)

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《Python | 编程解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1fa90;1. 初识Python …

matlab多元线性回归

1.matlab多元回归示例如下&#xff1a; 解决问题&#xff1a;油价预测 方法&#xff1a;多元线性回归 实现&#xff1a;matlab regress()函数 技巧&#xff1a;通过增加X1^2&#xff0c;X2^2&#xff0c;或者X1*X2等构造的特征项&#xff0c;可以提高回归模型的拟合准确度&…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑩

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷10 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷10 模块…

Java项目:117SpringBoot动漫论坛网站

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 117SpringBoot动漫论坛网站 一、项目介绍 动漫论坛网站是由SpringBootMybatis开发的&#xff0c;旅游网站分为前台和后台&#xff0c;前台为用户浏览&#xff0c;后台进…

Java零基础教学文档第三篇:JDBC

今日新篇章 【JDBC】 【主要内容】 JDBC概述 使用JDBC完成添加操作 使用JDBC完成更新和删除 DBUtils的简单封装 使用JDBC完成查询 使用JDBC完成分页查询 常用接口详解 JDBC批处理 SQL注入问题 事务处理解决转账问题 连接池 使用反射对DBUtils再次的封装 BaseDAO的封…

如何查看Ubuntu内存的使用情况

在Linux系统中&#xff0c;了解内存使用情况对于系统管理和性能优化非常重要。以下是一些常用的命令&#xff0c;以及它们的详细使用说明&#xff1a; 1. free 命令 用途: free 命令用于显示系统中空闲和已用的物理内存及交换内存。示例: 输入命令: free -m输出解释: 这将以M…

alertmanager高可用集群的部署方案

目录 alertmanager集群模式如何形成&#xff1f; 先看看prometheus这边怎么配 非容器部署 基于容器部署 alertmanager集群模式如何形成&#xff1f; 官方的&#xff1a;Alertmanager | Prometheus GitHub - prometheus/alertmanager: Prometheus Alertmanager 基本上就是…

C++面试宝典第18题:旋转数组

题目 给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。要求如下: (1)尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 (2)使用时间复杂度为O(n)和空间复杂度为O(1)的原地算法解决这个问题。 示例 1: 输入: [1, 2, 3, 4, 5, 6, 7] 和 k…

Vue中的class和style绑定

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介动态绑定class对象语法数组语法 动态绑定style对象语法多重值 ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习…

免费远程控制软件推荐2024最新

远程控制软件在我们的生活和工作中越来越常见&#xff0c;今天给大家分享一个免费的远程控制软件&#xff0c;教你如何使用手机远程控制电脑。 首先&#xff0c;您需要在电脑上安装KKView远程控制软件&#xff0c;该软件提供手机端和桌面端。安装完成后&#xff0c;您将获得一个…

win7添加access的odbc数据源

从控制面板打开odbc数据源&#xff1b;如果像下面没有access的驱动程序&#xff0c; 根据资料&#xff0c;打开C盘-Windows-SysWow64-odbcad32.exe&#xff0c;看一下就有了&#xff1b; 然后添加用户DSN&#xff0c;选中access的驱动程序&#xff0c; 自己输入一个数据源名&am…

Hive基础知识(七):Hive 数据类型全解

1. 基本数据类型 对于 Hive 的 String 类型相当于数据库的 varchar 类型&#xff0c;该类型是一个可变的字符串&#xff0c;不过它不能声明其中最多能存储多少个字符&#xff0c;理论上它可以存储2GB 的字符数。 2. 集合数据类型 Hive 有三种复杂数据类型 ARRAY、MAP 和 STRUCT…

docker 部署项目的操作文档,安装nginx

目录 1 部署环境检查2 相关知识点2.1 docker默认镜像存放地址2.2 docker 的镜像都是tar 包&#xff1f;2.3 Docker-compose 是直接使用镜像创建容器&#xff1f;2.4 Docker Compose down 就是将容器删除&#xff1f;2.5 删除&#xff0c;会删除挂载嘛2.6 DockerFile 和 docker …