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

news2024/11/18 12:44:51

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.py

import cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetector
import math
import time


cap=cv2.VideoCapture(0)
detector=HandDetector(maxHands=1)

offset=20
imgSize=300
folder=".21 Americal_ASL/Data/D"
count=0

while 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)*255
        imgCrop = img[y-offset:y+h+offset,x-offset:x+w+offset]

        imgCropShape = imgCrop.shape

        aspectRatio = h/w
        if aspectRatio>1:
            k=imgSize/h
            wCal=math.ceil(k*w)
            imgResize=cv2.resize(imgCrop,(wCal,imgSize))
            imgResizeShape=imgResize.shape
            wGap=math.ceil((imgSize-wCal)/2)
            imgWhite[:,wGap:wGap+wCal]=imgResize

        else:
            k = imgSize / w
            hCal = math.ceil(k * h)
            imgResize = cv2.resize(imgCrop, (imgSize,hCal))
            imgResizeShape = imgResize.shape
            hGap = math.ceil((imgSize - hCal) / 2)
            imgWhite[hGap:hGap + hCal,:] = imgResize

        cv2.imshow("ImageCrop",imgCrop)
        cv2.imshow("imageWhite",imgWhite)

    cv2.imshow("Image",img)
    k=cv2.waitKey(1)
    if k==ord('s'):
        count+=1
        cv2.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 Classifier


cap=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)*255
        imgCrop = img[y-offset:y+h+offset,x-offset:x+w+offset]

        imgCropShape = imgCrop.shape
        aspectRatio = h/w

        if aspectRatio>1:
            k=imgSize/h
            wCal=math.ceil(k*w)
            imgResize=cv2.resize(imgCrop,(wCal,imgSize))
            imgResizeShape=imgResize.shape
            wGap=math.ceil((imgSize-wCal)/2)
            imgWhite[:,wGap:wGap+wCal]=imgResize
            prediction, index =  classifier.getPrediction(imgWhite,draw=False)
            print(prediction,index)

        else:
            k = imgSize / w
            hCal = math.ceil(k * h)
            imgResize = cv2.resize(imgCrop, (imgSize,hCal))
            imgResizeShape = imgResize.shape
            hGap = math.ceil((imgSize - hCal) / 2)
            imgWhite[hGap:hGap + hCal,:] = imgResize
            prediction, 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.coloradmin.cn/o/374927.html

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

相关文章

group by聚合分组后如何获取分组数据

之前用group by分组后一直困惑怎么把分组后的数据拿到,因为分组后同一组的只有一条数据,最后发现了group_concat函数。记录一下,以后能用。语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator…

【MySQL - InnoDB 存储结构】行格式详解

我们平时对 MySQL 的了解都只是限制在使用层面上,但是难道你就没有一个时刻好奇 MySQL 的内部结构嘛,我们通过 SQL 语句插入的一条条记录在 MySQL 底层到底是以什么格式存储的呢 ? 本文就将以 InnoDB 存储引擎为例子,介绍 MySQL 存…

专科top4|临床医生CSC公派博士后美国凯斯西储大学医院赴职

Q医生符合CSC公派博士后申报条件,我们先为其取得Hopkins的邀请函并获CSC批准,后因导师失联,为保险起见,我们又继续申请并获得凯斯西储大学医学院彩虹宝宝和儿童医院的邀请函,该院连续20年被评为全美最好儿童医院&#…

【vulhub漏洞复现】CVE-2015-5254 ActiveMQ反序列化漏洞

一、漏洞详情Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务,集群,Spring Framework等。配置Apache ActiveMQ需要提前有jdk的环境。基于MQTT,消息订阅和分…

Javascript的API基本内容(三)

一、事件流 假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段简单来说:捕获阶段是 从父到子 冒泡阶段是从子到父实际工作都是使用事件冒泡为主 二、页面加载事件 加载外部资源(如图片、外联CS…

Portraiture4免费磨皮插件支持PS/LR

Portraiture 4免去了繁琐的手工劳动,选择性的屏蔽和由像素的平滑,以帮助您实现卓越的肖像润色。智能平滑,并删除不完善之处,同时保持皮肤的纹理和其他重要肖像的细节,如头发,眉毛,睫毛等。 一键…

Python Flask + Echarts 轻松制作动态酷炫大屏( 附代码)

目录一、确定需求方案二、整体架构设计三、编码实现 (关键代码)四、完整代码五、运行效果1.动态实时更新数据效果图 说明: 其中 今日抓拍,抓拍总数,预警信息统计,监控点位统计图表 做了动态实时更新处理。 ​ 2.静态…

Java岗面试题--Java并发(volatile 专题)

目录1. 面试题一:谈谈 volatile 的使用及其原理补充:内存屏障volatile 的原理2. 面试题二:volatile 为什么不能保证原子性3. 面试题三:volatile 的内存语义4. 面试题四:volatile 的实现机制5. 面试题五:vol…

用c语言模拟实现常用字符串函数

目录 一.常用字符串函数介绍 1.strlen 2. strcpy 3.strcmp 4.strcat 5.strstr 二.模拟实现常用字符串函数 1.strlen 2.strcpy 3.strcmp 4.strcat 5.strstr 一.常用字符串函数介绍 1.strlen 字符串strlen是用来求字符串长度的,我们可以打开cpp网站查看有关…

浅谈模型评估选择及重要性

作者:王同学 来源:投稿 编辑:学姐 模型评估作为机器学习领域一项不可分割的部分,却常常被大家忽略,其实在机器学习领域中重要的不仅仅是模型结构和参数量,对模型的评估也是至关重要的,只有选择那…

vector迭代器失效与深浅拷贝问题

目录 1、vector迭代器失效问题 1.1、insert迭代器失效 扩容导致野指针 意义变了 官方库windows下VS和linux下对insert迭代器失效的处理 1.2、erase迭代器失效 官方库windows下VS和linux下对erase迭代器失效的处理 1.3、迭代器失效总结 2、深浅拷贝问题 1、vector迭…

GeoServer发布数据进阶

GeoServer发布数据进阶 GeoServer介绍 GeoServer是用于共享地理空间数据的开源服务器。 它专为交互操作性而设计,使用开放标准发布来自任何主要空间数据源的数据。 GeoServer实现了行业标准的 OGC 协议,例如网络要素服务 (WFS)…

Java【优先级队列】模拟实现 + 【PriorityQueue】介绍

文章目录一、什么是优先级队列二、模拟实现1, 实现堆的基本操作1.1, 创建堆1.2.1, 向下调整1.2, 堆的插入1.2.1, 向上调整1.2, 堆的删除2, 实现优先级队列2.1, offer -- 插入数据2.1, poll -- 删除数据三、Java提供的PriorityQueue1, PriorityQueue说明2, 使用PriorityQueue2.1…

【Linux】安装Tomcat教程

目录 1.上传安装包 2.解压安装包 3.启动Tomcat 4.查看启动日志 5.查看进程 6.开放端口 7.停止Tomcat 1.上传安装包 使用FinalShell自带的上传工具将Tomcat的二进制发布包上传到Linux(与前面上传JDK安装包步骤 一致)。 2.解压安装包 将上传上来的安装包解压到指定目录…

2023年想跳槽,什么类型的人才需求最多?

某招聘网站资深HR对此表示:纵观当前招聘市场,无论是比较火爆的互联网行业还是传统行业,技能型人才都是最受欢迎的人才之一;那些拥有职场一技之能的跳槽者往往跳的结果更好,包括薪酬水平和发展空间、重视程度等。 那选择…

一个更适合Java初学者的轻量级开发工具:BlueJ

Java是世界上最流行的编程语言之一,它被广泛用于从Web开发到移动应用的各种应用程序。大部分Java工程师主要是用IDEA、Eclipse为主,这两个开发工具由于有强大的能力,所以复杂度上就更高一些。如果您刚刚开始使用Java,或者您更适合…

如何简化跨网络安全域的文件发送流程,大幅降低IT人员工作量?

为什么要做安全域的隔离? 随着企业数字化转型的逐步深入,企业投入了大量资源进行信息系统建设,信息化程度日益提升。在这一过程中,企业也越来越重视核心数据资产的保护,数据资产的安全防护成为企业面临的重大挑战。 …

自动化测试学习步骤及路线(超详细)

随着测试行业的不断发展,目前企业对测试人员要求越来越高,仅仅响应需求的功能测试人员基本饱和或是留给了校招生。而对于社招渠道的应聘者,企业越来越多地要求有一定的自动化或是代码经验,能解决工作过程中遇到的问题,…

ledcode【用队列实现栈】

目录 题目描述: 解析题目 代码解析 1.封装一个队列 1.2封装带两个队列的结构体 1.3封装指向队列的结构体 1.4入栈函数实现 1.5出栈函数实现 1.6取栈顶数据 1.7判空函数实现 题目描述: 解析题目 这个题我是用c语言写的,所以队列的pu…

魔兽世界WoW注册网站搭建——-Liunx

问题背景哎 搭建了一个魔兽3.35(纯洁版)每当同学朋友要玩的时候我都直接worldserver上面打一个命令随之出现朋友的朋友也要玩想了想还是要有一个网站原本以为吧单机版里面网页的IP数据库改下可以了结果PHP报错了Unknown column sha_pass_hash in field l…