Opencv项目实战:21 美国ASL手势识别
0、项目介绍
首先,我可以保证在这里,你并不需要多么了解深的机器学习算法,我的初衷是通过本项目,激发大家学习机器学习的动力。选择这种手势原因是因为只有24个字母,你的电脑足以带的动,虽然我只训练A、B、C、D等字母的手势识别,但只要掌握了方法,你可以全部弄完24个字母的手势(我觉得没这必要)。
如果你的思维足够的发散,相信你一定会有其他的好点子。
1、效果展示
2、项目搭建
这个地方依赖的包有些多:{cv2、numpy、cvzone、tensorflow}
tensorflow的下载用pip下载不了,找了很多办法,本人有效解决的是:
pip install --index-url https://pypi.douban.com/simple tensorflow
3、代码的展示与讲解
# traing.pyimport cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetector
import math
import timecap=cv2.VideoCapture(0)
detector=HandDetector(maxHands=1)offset=20
imgSize=300
folder=".21 Americal_ASL/Data/D"
count=0while True:ret,img=cap.read()hands,img=detector.findHands(img)if hands:hand = hands[0]x,y,w,h=hand['bbox']imgWhite=np.ones((imgSize,imgSize,3),np.uint8)*255imgCrop = img[y-offset:y+h+offset,x-offset:x+w+offset]imgCropShape = imgCrop.shapeaspectRatio = h/wif aspectRatio>1:k=imgSize/hwCal=math.ceil(k*w)imgResize=cv2.resize(imgCrop,(wCal,imgSize))imgResizeShape=imgResize.shapewGap=math.ceil((imgSize-wCal)/2)imgWhite[:,wGap:wGap+wCal]=imgResizeelse:k = imgSize / whCal = math.ceil(k * h)imgResize = cv2.resize(imgCrop, (imgSize,hCal))imgResizeShape = imgResize.shapehGap = math.ceil((imgSize - hCal) / 2)imgWhite[hGap:hGap + hCal,:] = imgResizecv2.imshow("ImageCrop",imgCrop)cv2.imshow("imageWhite",imgWhite)cv2.imshow("Image",img)k=cv2.waitKey(1)if k==ord('s'):count+=1cv2.imwrite(f"{folder}/Image_{time.time()}.jpg",imgWhite)print(count)elif k==27:break
首先,在这里先运行这个文件,它会出现下面这样的窗口:
接下来,就按照美国ASL手势,对数据进行收集,你只需要在成功识别后,不断的点击键盘"s"键,对图片进行保存,一定要记住修改保存的文件位置,也就是变量folder,我收集的数量大概在300张左右,多一点少一些也无所谓,识别的效果还是相当不错的。
Teachable Machine 是一个基于 Web 的工具,为每个人创造快速、简明、易用的机器学习模型。
进入这个网站Teachable Machine,将文件{A、B、C、D}拖进去,可能需要一点时间,耐心等等就行,获得了keras_model.h5和labels.txt文件,我在得到labels.txt文件时,出现了点问题,不过你也可以手动添加一下,毕竟不是很多。
0 A 1
1 B 2
2 C 3
3 D 4
这个网站需要"KX"上网,当时做完没有保存图片,现在流量也已经用完了,所以这个地方大家就自己琢磨一下吧。
# test.py
import cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetector
import math
from cvzone.ClassificationModule import Classifiercap=cv2.VideoCapture(0)
detector=HandDetector(maxHands=1)
classifier=Classifier("E:\pythonProject1\Opencv project training//21 Americal_ASL\Model\keras_model.h5","E:\pythonProject1\Opencv project training//21 Americal_ASL\Model\labels.txt")offset=20
imgSize=300
# folder=".21 Americal_ASL/Data/D"
count=0
labels = ['A','B','C','D']while True:ret,img=cap.read()imgOutput = img.copy()hands,img=detector.findHands(img)if hands:hand = hands[0]x,y,w,h=hand['bbox']imgWhite=np.ones((imgSize,imgSize,3),np.uint8)*255imgCrop = img[y-offset:y+h+offset,x-offset:x+w+offset]imgCropShape = imgCrop.shapeaspectRatio = h/wif aspectRatio>1:k=imgSize/hwCal=math.ceil(k*w)imgResize=cv2.resize(imgCrop,(wCal,imgSize))imgResizeShape=imgResize.shapewGap=math.ceil((imgSize-wCal)/2)imgWhite[:,wGap:wGap+wCal]=imgResizeprediction, index = classifier.getPrediction(imgWhite,draw=False)print(prediction,index)else:k = imgSize / whCal = math.ceil(k * h)imgResize = cv2.resize(imgCrop, (imgSize,hCal))imgResizeShape = imgResize.shapehGap = math.ceil((imgSize - hCal) / 2)imgWhite[hGap:hGap + hCal,:] = imgResizeprediction, index = classifier.getPrediction(imgWhite, draw=False)cv2.rectangle(imgOutput, (x - offset, y - 50),(x - offset+120, y - offset), (255, 0, 255), cv2.FILLED)cv2.putText(imgOutput,labels[index],(x+12,y-27),cv2.FONT_HERSHEY_COMPLEX,1.8,(255,255,255),2)cv2.rectangle(imgOutput,(x-offset,y-offset),(x+w+offset,y+h+offset),(255,0,255),4)cv2.imshow("ImageCrop",imgCrop)cv2.imshow("imageWhite",imgWhite)cv2.imshow("Image",imgOutput)k=cv2.waitKey(1)if k==27:break
这是用于测试的代码,运行之后,就可以展现我们本项目的效果了。
4、项目资源
GitHub:21 美国ASL手势识别
5、项目总结
顺利完成,因为这个是很早之前做的,一直没空写,而且因为之前python环境出现了问题,重新装了一次,下载的那些包都没了,有很多空缺,这几天装Tensorflow,也是把我搞得心态爆炸,但基础的效果总算是可以展现了。虽然teachable machine可能你进不去,但如果你只是抱着学习的态度,那么在GitHub里面我也提供了我做的A、B、C、D的文件。
相关文章:

Opencv项目实战:21 美国ASL手势识别
0、项目介绍 首先,我可以保证在这里,你并不需要多么了解深的机器学习算法,我的初衷是通过本项目,激发大家学习机器学习的动力。选择这种手势原因是因为只有24个字母,你的电脑足以带的动,虽然我只训练A、B、…...

强化学习RL 01: Reinforcement Learning 基础
目录 RL理解要点 1. RL数学基础 1.1 Random Variable 随机变量 1.2 概率密度函数 Probability Density Function(PDF) 1.3 期望 Expectation 1.4 随机抽样 Random Sampling 2. RL术语 Terminologies 2.1 agent、state 和 action 2.2 策略 policy π 2.3 奖励 reward …...

C语言之练习题合集
💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 文章目录leetcode 题号:728. 自除数leetcode 题号:238.…...

sublimeText3新建文件自动添加注释头
参考: https://github.com/shiyanhui/FileHeader/blob/master/README.rst https://packagecontrol.io/packages/FileHeader https://github.com/shiyanhui/FileHeader fileheader:https://codeload.github.com/shiyanhui/FileHeader/zip/refs/heads/m…...

AndroidStudio打包HBuilderX的H5+项目为安卓App【一次过,无任何异常报错】
目录 1.查看HBuilderX的版本号 2.下载Dcloud上对应的安卓SDK 3.下载完安卓SDK后,我们解压它,注意不要放在任何有中文组成的文件夹中【是否有中文决定于你鼠标单击上面路径后,第一张图还没鼠标单击,第二张已鼠标单击,…...

【Linux】进程概念
目录 一、基本概念 二、查看进程 三、系统调用获取进程标示符 1、获取自己的PID 2、获取父进程的PID 四、创建进程 1、初识fork 2、使用fork的方式 五、进程状态 1、阻塞 2、挂起 3、R状态 4、S状态 5、D状态 6、T状态 6.1、kill指令 6.2、暂停进程与继续进程 …...
使用pyinstaller库打包exe时显示KeyError怎么办
PyInstaller是一个Python库,用于将Python应用程序转换为独立的可执行文件(executable)文件,支持多平台。它可以将Python解释器、依赖的库和脚本打包成一个单独的可执行文件,从而使应用程序可以独立运行,而无…...
k8s新增节点机器,无法拉取和推送镜像的解决方案
1、首先检查配置,查看镜像仓库是否已授权,若无授权,则进行授权。 命令:cat /etc/systemd/system/docker.service.d/docker-options.conf内容如果有这样一句就是已经授权,如果没有,就需要把这句加进去&…...

测试报告踩坑的点
测试报告作为测试人员的核心输出项,是体现自己工作价值的重要承载工具,需要我们认真对待,所以我们要重视测试报告的输出,那么在编写测试报告的时候,我们有哪些点需要注意的呢? 01 不要乱用模板 很多测试新人在编写测试…...

【Java】创建多线程的四种方式
一、方式1:继承Thread类 步骤: 创建一个继承于Thread类的子类重写Thread类的run()方法 ----> 此线程执行的操作声明在方法体中创建当前Thread子类的对象通过实例对象调用start()方法,启动线程 ----> Java虚拟机会调用run()方法 注意…...

【数据结构】队列的接口实现(附图解和源码)
队列的接口实现(附图解和源码) 文章目录队列的接口实现(附图解和源码)前言一、定义结构体二、接口实现(附图解源码)1.初始化队列2.销毁队列3.队尾入队列4.判断队列是否为空5.队头出队列6.获取队列头部元素7…...

日本知名动画公司东映动画加入 The Sandbox 元宇宙
与 Minto 合作将东映动画的 IP 呈现在元宇宙。 The Sandbox 很荣幸能与东映动画合作,与 Minto 携手在 The Sandbox 元宇宙中创建基于东映动画 IP 的相关体验。 作为日本动画的先驱,东映动画制作了日本最大和世界领先的动画作品,包括《龙珠》、…...

QuickHMI Hawk R3 Crack
基于网络的 SCADA / HMI 系统 QuickHMI Hawk R3 QuickHMI是一个 100% 基于网络的SCADA/HMI 系统。 得益于HTML5、SVG和Javascript等现代网络技术,可视化可以在任何当前浏览器和设备中显示。作为浏览器的替代品,可以使用“独立查看器”和移动应用程序。 Q…...
【C语言】寻找隐藏字母游戏
编程实现一个游戏程序,会将连续三个字母中的一个隐去,由玩家填写隐去的那个字母,如屏幕上显示A ? C,则玩家需要输入B;屏幕上显示?B C,则玩家需要输入A。记录玩家完成20次游戏的时间以及正确率。…...

【C++】list 相关接口的模拟实现
list 模拟实现回顾准备构造析构函数的构造构造方法析构方法赋值运算符重载容量相关接口元素获取元素修改相关接口push 、popinserterase清空交换迭代器 **(重点)迭代器基本概念迭代器模拟实现回顾 在上一篇博客中我们大致了解了 list 相关接口的使用方法…...

快速找到外贸客户的9种方法(建议收藏)
所有外贸企业想要做好外贸出口的头等大事,就是要快速的找到优质的外贸客户和订单,没有订单的达成,所有的努力都是图劳,还有可能会陷入一种虚假的繁荣,每天都很忙,但是没有结果。今天,小编就来分…...

TCP状态转换
欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 TCP状态转换专栏:《Linux从小白到大神》《网络编程》 TCP状态转换示意图如下 针对上面的示…...
3500年里,印度被11个文明征服
转自:3500年里,印度被11个文明征服,如今看似统一,实际上却是缝合怪 (qq.com)今天的印度是亚洲第二大国,南亚第一大国,世界第二人口大国。如果我们将时间线拉长,纵观历史的长河,就会惊…...
Java编程问题top100---基础语法系列(一)
Java编程问题top100---基础语法系列一一、Java 操作符实质二、将InputStream转换为String使用IOUtils自己写轮子三、将数组转换为List四、如何遍历map对象使用For-Each迭代entries(方法一)使用For-Each迭代keys和values(方法二)使…...
【C#基础】C# 异常处理操作
序号系列文章6【C#基础】C# 常用语句讲解7【C#基础】C# 常用数据结构8【C#基础】C# 面向对象编程文章目录前言1,异常的概念2,处理异常3,自定义异常4,编译器异常结语前言 🌷大家好,我是writer桑,…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

多模态学习路线(2)——DL基础系列
目录 前言 一、归一化 1. Layer Normalization (LN) 2. Batch Normalization (BN) 3. Instance Normalization (IN) 4. Group Normalization (GN) 5. Root Mean Square Normalization(RMSNorm) 二、激活函数 1. Sigmoid激活函数(二分类&…...