Opencv项目实战:21 美国ASL手势识别

news/2024/11/6 13:55:07/

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的文件。


http://www.ppmy.cn/news/28727.html

相关文章

Java 练习题:输出纯素数

文章目录纯素数简介任务要求思路解析源码奉上运行效果总结纯素数简介 所谓纯素数就是该数本身不仅是素数,并且该数的每一位都是素数。 例如:23,37是纯素数,但13,29不是。 任务要求 输出55555内所有的纯素数,按每行20个的格式化…

RocketMQ动态增加NameServer

前言 通过HTTP服务来设置NameServer地址,是唯一支持动态增加NameServer的方式,无需重启其它组件 网上搜了下没看到有兄弟们演示这块,所以刚才自己试了试,做个笔记 本文有详细的演示过程 都知道NameServer有4种配置方式&#xff0…

力扣-合作过至少三次的演员和导演

大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:1050. 合作过至少三次的演员和导演二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运…

Vue项目中components组件的使用笔记

目录 前言 一、components和component的区别? 二、components使用的步骤 1.创建组件vue文件 2.引入组件 3.注册组件 4.应用组件 总结 前言 本文章,只是初步了解记录components的使用步骤。 一、components和component的区别? compo…

MySQl总结

文章目录MySQL数据库的常见考点1、ACID事务原理事务持久性事务原子性MVCC基本概念MVCC基本原理undo logundo log版本链readviewMVCC实现原理RC读已提交RR可重复读MVCC实现原理总结2、并发事务引发的问题3、事务隔离级别4、索引索引结构BTreeHash面试题索引分类思考题语法性能分…

Spring中常用注解

声明 bean 的注解 Component:泛指各种组件 Controller、Service、Repository 都可以称为Component Controller:控制层 Service:业务层 Repository:数据访问层Bean 的生命周期属性 Scope 设置类型包括:设置 Spring 容器…

3 决策树及Python实现

1 主要思想 1.1 数据 1.2 训练和使用模型 训练:建立模型(树) 测试:使用模型(树) Weka演示ID3(终端用户模式) 双击weka.jar选择Explorer载入weather.arff选择trees–>ID3构建树…

JAVA开发(JAVA垃圾回收的几种常见算法)

JAVA GC 是JAVA虚拟机中的一个系统或者说是一个服务,专门是用于内存回收,交还给虚拟机的功能。 JAVA语言相对其他语言除了跨平台性,还有一个最重要的功能是JAVA语言封装了对内存的自动回收。俗称垃圾回收器。所以有时候我们不得不承认&#…