竞赛保研 基于机器视觉的手势检测和识别算法
0 前言
🔥 优质竞赛项目系列,今天要分享的是
基于深度学习的手势检测与识别算法
该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!
🧿 更多资料, 项目分享:
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] = 255else:skin2[i][j] = 0cv2.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
相关文章:
竞赛保研 基于机器视觉的手势检测和识别算法
0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng…...
Android App从备案到上架全过程
不知道大家注意没有,最近几年来,新的移动App想要上架是会非常困难的,并且对于个人开发者和小企业几乎是难如登天,各种备案和审核。但是到底有多难,或许只有上架过的才会有所体会。 首先是目前各大应用市场陆续推出新的声明,各种备案截止日期到12月就要到最后期限责令整改…...
用邮件及时获取变更的公网IP--------python爬虫+打包成exe文件
参考获取PC机公网IP并发送至邮箱 零、找一个发送邮件的邮箱 本文用QQ邮箱为发送邮箱,网易等邮箱一般也有这个功能,代码也是通用的。 第一步:在设置中找到账户,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,点击获…...
c++学习:函数模板+实战
目录 函数模板 思考 如果两个参数的类型不一样可以下面这么写 如果有指定返回参数可以下面这么写 实战 找出三个数中最大的一个 函数模板 实际上就是建立一个通用函数,其函数返回值类型和形参类型不具体指定,用一个虚拟的类型来代表template 是一个…...
three.js gltf后处理颜色异常(伽马校正)
效果: 应用了伽马校正,好像效果不明显 代码: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"><…...
面试经典150题(55-58)
leetcode 150道题 计划花两个月时候刷完,今天(第二十四天)完成了4道(55-58)150: 55.(19. 删除链表的倒数第 N 个结点)题目描述: 给你一个链表,删除链表的倒数第 n 个结点ÿ…...
如果一个n位正整数等于其各位数字的n次方之和
❤ 厾罗 如果一个n位正整数等于其各位数字的n次方之和 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数。 例如1^3 5^3 3^3 153。 1000以内的阿姆斯特朗数: 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407。 以下代码用于检测用户输…...
solidity显示以太坊美元价格
看过以太坊白皮书的都知道,以太坊比较比特币而言所提升的地方中,我认为最重要的一点就是能够访问外部的数据,这一点在赌博、金融领域应用会很广泛,但是区块链是一个确定的系统,包括里面的所有数值包括交易ID等都是确定…...
ChatGPT学习笔记——大模型基础理论体系
1、ChatGPT的背景与意义 近期,ChatGPT表现出了非常惊艳的语言理解、生成、知识推理能力, 它可以极好的理解用户意图,真正做到多轮沟通,并且回答内容完整、重点清晰、有概括、有条理。 ChatGPT 是继数据库和搜索引擎之后的全新一代的 “知识表示和调用方式”如下表所示。 …...
Termius for Mac/Win:一款功能强大的终端模拟器、SSH 和 SFTP 客户端软件
随着远程工作和云技术的普及,对于高效安全的远程访问和管理服务器变得至关重要。Termius,一款强大且易用的终端模拟器、SSH 和 SFTP 客户端软件,正是满足这一需求的理想选择。 Termius 提供了一站式的解决方案,允许用户通过单一平…...
python如何读取被压缩的图像
读取压缩的图像数据: PackBits 压缩介绍: CCITT T.3 压缩介绍: 读取压缩的图像数据: 在做图像处理的时候,平时都是使用 函数io.imread() 或者是 函数cv2.imread( ) 函数来读取图像数据,很少用PIL.Image…...
华为OD机试 - 寻找最优的路测线路(Java JS Python C)
题目描述 评估一个网络的信号质量,其中一个做法是将网络划分为栅格,然后对每个栅格的信号质量计算。 路测的时候,希望选择一条信号最好的路线(彼此相连的栅格集合)进行演示。 现给出 R 行 C 列的整数数组 Cov,每个单元格的数值 S 即为该栅格的信号质量(已归一化,无单…...
互联网演进历程:从“全球等待”到“全球智慧”的技术革新与商业变革
文章目录 一、导言二、World Wide Wait (全球等待)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 三、World Wide Web (万维网)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 四、World Wide Wisdom (全球智慧)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 五、…...
计算机组成原理——总线
总线特点 1.1. 分时:分时是指同一时刻只允许有一个部件向总线发送信息,若系统中有多个部件,则它们只能分时地向总线发生信息。 1.2. 共享:共享是指总线上可以挂接多个部件,各个部件之间互相交换的信息都可以通过这组线…...
2023.12.27 关于 Redis 数据类型 List 常用命令
目录 List 类型基本概念 List 类型特点 List 操作命令 LPUSH LPUSHX RPUSH RPUSHX LRANGE LPOP RPOP LINDEX LINSERT LREM LTRIM LSET 阻塞版本的命令 阻塞版本 和 非阻塞版本的区别 BLPOP & BRPOP List 类型基本概念 Redis 中的列表(list&am…...
【Web】vulhub-httpd apache解析漏洞复现(1)
目录 ①CVE-2017-15715 ②apache_parsing_vulnerability ①CVE-2017-15715 贴出源码: <?php if(isset($_FILES[file])) {$name basename($_POST[name]);$ext pathinfo($name,PATHINFO_EXTENSION);if(in_array($ext, [php, php3, php4, php5, phtml, pht]))…...
市场复盘总结 20240103
仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整 昨日回顾: 方法一:指标选股 select * from dbo.ResultAll where 入选类型 like %指标选股% and 入选日期=20240103;方法二:趋势选股法 1、最低价持续3日上涨 2、均价…...
Java技术栈 —— Redis的雪崩、穿透与击穿
Java技术栈 —— Redis的雪崩、穿透与击穿 〇、实验的先导条件(NginxJmeter)一、Redis缓存雪崩、缓存穿透、缓存击穿1.1 雪崩1.2 穿透1.3 击穿 二、Redis应用场景——高并发2.1 单机部署的高并发问题与解决(JVM级别锁)2.2 集群部署…...
Scala知识点——App类
我们在代码中一般程序都是是通过main方法进入。但是在scala中提供了一个App类,通过继承可以实现不用显式的调用main方法就能运行。 App类中实现了main方法:...
(vue)增加行,对应行删除
(vue)增加行,对应行删除 效果: 代码: <div v-for"(ele,i) of algorithmList" :key"i"><el-form-item label"模型类型"><el-selectv-model"ele.algorithmId"placeholder"选择模…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
