智能产品综合开发 - 手势识别

1 实训选题目的

        本次实训选择的题目是“基于树莓派的手势识别系统”,旨在为人们提供一种便捷的交互方式,使用户能够通过手势控制智能设备,摆脱传统的物理按键操作。通过本项目,我们希望能实现快速、灵活的手势识别,提升用户体验和居住环境的智能化水平,我们将能够将所学的人工智能专业知识进行综合应用,包括但不限于Linux操作系统、Python程序设计、人工智能数据处理、机器学习技术及应用、计算机视觉技术、响应式网页设计、创新创业教育、数据库基础、软件工程和人工智能产品开发等。本项目要求小组成员能够灵活运用这些知识,开发出具有一定创新性和实用价值的人工智能产品。

2 实训任务目的

        通过本次“手势识别”的实训任务,目的是使团队成员掌握树莓派硬件的基本组成,并能够完成树莓派硬件的搭建、新版64位桌面版系统的烧录安装以及SSH、VNC、用户密码等基础配置。这些步骤将为团队成员提供远程控制树莓派的能力,为后续的温湿度检测系统开发打下坚实的基础。此外,本任务还将帮助团队成员熟悉树莓派的操作系统环境,确保在后续的开发过程中能够有效地进行编程和调试,实现智能家居的各项功能,包括数据采集、处理、存储和可视化展示。通过本实训,学生将学会如何将理论知识应用于实际问题,提高解决实际问题的能力,并增强团队合作和项目管理的技能。

3 实训介绍

(一)必备功能说明:

1.手势识别功能
通过摄像头实时捕捉用户的手势,使用百度AI手势识别API进行分析。系统支持多种手势的识别,如“点赞”、“OK”、“拳头”等,并在控制台输出识别结果。

2.语音播报功能:
将识别到的手势内容通过百度AI语音合成API生成语音,用户可以通过声音获取识别结果。语音内容使用识别到的手势名称。

3.状态反馈功能:
在识别到的手势区域绘制矩形框,提供视觉反馈,用户可以直观地看到识别结果的位置。

通过本次实训,我们的目标是开发一个功能全面、用户友好且具备一定智能的手势识别系统,增强人机交互的自然性和便利性。

4 实训组件

  1. 树莓派主板1块
  2. 树莓派电源适配器1个
  3. 40P软排线1根
  4. 温湿度传感器1个
  5. 面包板1个
  6. 跳线若干
  7. 电阻若干(用于温湿度传感器电流限制)
  8. 杜邦线若干(用于连接面包板上的组件)
  9. 显示器1个
  10. SD卡1张
  11. 网络线1根
  12. 外壳和保护套1个
  13. 摄像头

5 实训原理

以下是手势识别的核心工作原理:

  1. 系统架构
    系统搭建在树莓派上,通过摄像头进行视频捕捉,利用Python及相关库执行手势识别与语音播报。
  2. 手势捕捉与识别
    使用OpenCV库捕捉用户的手势图像。系统每隔一定帧数(如每5帧)进行处理,保存当前帧,将其转化为可供识别的格式,并调用百度AI手势识别API进行分析。
  3. 反馈机制
    识别出的手势通过gestures字典映射到具体的名称,并在控制台输出相应的信息。同时,识别结果将通过百度的文本转语音API进行语音播报,用户可以听到实时的反馈信息。
  4. 状态显示与反馈
    每次识别后,系统在图像上绘制识别区域的矩形框,加强用户对手势识别结果的理解。识别到的手势信息也通过文本形式展示在控制台,方便开发调试和用户观察。
  5. 数据处理
    手势识别结果进行动态处理,拼接识别的多个手势形成综合反馈,用于语音合成。通过适当的控制确保每次处理后的反馈有效传达给用户,同时处理错误情况(如未识别到手势)。

6 最终代码展示 

Gesture_recognition.py:

import os
import cv2
from aip import AipBodyAnalysis
import requests

# 手势识别字典
gestures = {
    'One': '数字1(原食指)',
    'Five': '数字5(原掌心向前)',
    'Fist': '拳头',
    'OK': 'OK',
    'Prayer': '祈祷',
    'Congratulation': '作揖',
    'Honour': '作别',
    'Heart_single': '单手比心',
    'Thumb_up': '点赞',
    'Thumb_down': 'Diss',
    'ILY': '我爱你',
    'Palm_up': '掌心向上',
    'Heart_1': '双手比心1',
    'Heart_2': '双手比心2',
    'Heart_3': '双手比心3',
    'Two': '数字2',
    'Three': '数字3',
    'Four': '数字4',
    'Six': '数字6',
    'Seven': '数字7',
    'Eight': '数字8',
    'Nine': '数字9',
    'Rock': 'Rock',
    'Insult': '竖中指',
    'Face': '脸'
}

# 百度AI平台的AppID、API Key和Secret Key
APP_ID = '116309748'
API_KEY = 'loIjB17JNpFWgdS8E5a9mcpU'
API_SECRET_KEY = 'xTZstlZd05fVJFD7ekWmWlH5boyRxpYD'

# 初始化百度AI手势识别客户端
Gestureclient = AipBodyAnalysis(APP_ID, API_KEY, API_SECRET_KEY)

# 获取access_token的URL
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=FC3iKrW69CfHdH00fYh2wViw&client_secret=ZZBUUlCqKx5A9w52Y0HY8J94FTr7vtB8'

# 请求access_token
response = requests.get(host)
if response:
    print(response.json())
    token: object = response.json()['access_token']  # 提取token的内容


# 读取图片内容的函数
def get_file_content(path):
    with open(path, 'rb') as fp:
        return fp.read()


# 初始化摄像头
cap = cv2.VideoCapture(0)
cap.set(3, 352)  # 设置宽度
cap.set(4, 288)  # 设置高度
frame_num = 0

# 循环获取摄像头帧
while cap.isOpened():
    ret, frame = cap.read()  # 获得帧
    if frame_num % 5 == 0:  # 每几秒处理一次
        cv2.imwrite("gesture.jpg", frame)  # 保存当前帧为图片
        image = get_file_content("gesture.jpg")  # 读取图片内容

        # 调用百度AI手势识别API
        message = Gestureclient.gesture(image)
        print(message)
        num = message['result_num']
        if num == 0:
            say = '没有识别到人体动作'
            cv2.imshow("gesture", frame)
        else:
            results = message['result']
            content = []
            say = ''
            for i, result in enumerate(results):
                classname = result['classname']
                gesture_name = gestures.get(classname, '未知手势')  # 使用.get方法避免KeyError
                print("第%d个识别结果为%s" % (i + 1, gesture_name))
                content.append(gesture_name)  # 直接添加手势名称
                cv2.rectangle(frame, (result['left'], result['top']),
                              (result['left'] + result['width'],
                               result['top'] + result['height']), (255, 255, 255), 2)
                cv2.imshow('gesture', frame)

                for j in range(len(content)):
                    say += str(content)
                print('say:', say)
                print('token:', token)

        # 语音播报结果
        url = f'http://tsn.baidu.com/text2audio?tex="{say}"&lang=zh_CN&per=0&pit=7&spd=5&cuid=***&ctp=1&tok={token}'

    frame_num += 1

    # 按'q'或空格键退出
    if cv2.waitKey(0) & 0xFF == ord('q') or cv2.waitKey(0) & 0xFF == ord(' '):
        break

# 释放摄像头资源并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

实验结果截图

7 参考文献

[1]张凯,陈峰.基于混合空洞卷积CNN和BiGRU的表面肌电信号手势识别[J/OL].计算机应用与软件,2024,(11):220-227[2024-11-28].http://kns.cnki.net/kcms/detail/31.1260.TP.20241126.1619.062.html.

[2]张会影,圣文顺,周子倡,等.手势识别技术研究[J].物联网技术,2024,14(11):36-38+41.DOI:10.16667/j.issn.2095-1302.2024.11.008.

[3]程亚龙,梁军,邹雲宇.基于YOLOv5的静态手势识别检测模型[J].软件导刊,2024,23(11):181-186.

[4]段元花,唐文鸿.基于动态手势识别的学前教育机器人人机交互技术研究[J].自动化与仪器仪表,2024,(09):263-267.DOI:10.14016/j.cnki.1001-9227.2024.09.263.

[5]谢强,张华梅,王宇才.基于OpenCV的手势识别技术在机电系统人机交互中的应用与研究[J].轻工科技,2024,40(05):119-121+159.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis【1】- 如何阅读Redis 源码

1 Redis 的简介 Redis 实际上是简称,全称为 Remote Dictionary Server (远程字典服务器),由 Salvatore Sanfilippo 写的高性能 key-value 存储系统,其完全开源免费,遵守 BSD 协议。Redis 与其他 key-value 缓存产品(如…

git的使用(简洁版)

什么是 Git? Git 是一个分布式版本控制系统 (DVCS),用于跟踪文件的更改并协调多人之间的工作。它由 Linus Torvalds 在 2005 年创建,最初是为了管理 Linux 内核的开发。Git 的主要目标是提供高效、易用的版本控制工具,使得开发者…

用于高吞吐量和低延迟的 JVM 性能调优

Java 虚拟机 (JVM) 调优是调整默认参数以满足我们的应用程序需求的过程。这包括通过选择合适的垃圾回收器来使用优化版本的 getter 来调整堆的大小等简单调整。 了解 Java 虚拟机 (JVM) 什么是 JVM? Java 虚拟机 &…

django authentication 登录注册

文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前,写了django制作简易登录系统,这次利用django内置的authentication功能实现注册、登录 提示&#xff…

Python+Pytest+Yaml+Allure数据参数化(DDT)数据驱动(一)

我们在做数据之前要知道几个问题 1、在代码层面怎么来数据驱动 2、yaml文件是什么 3、怎么用yaml文件实现对应的数据驱动 我们用的是pytest框架所以相对来说是简单的,我们通过pytest框架来实现,而框架中要数据驱动用到我们装饰器就好啦pytest.mark.p…

WaveForms™ SDK 参考手册(翻译笔记与总结)

概述 WaveForms 提供了一个接口,允许用户与 Digilent Analog Design 硬件进行交互,例如 Analog DiscoveryTM、Analog Discovery 2TM、Analog Discovery ProTM、Digital DiscoveryTM、Discovery Power SupplyTM 和 Electronics ExplorerTM。虽然 WaveForm…

Python基础学习-12匿名函数lambda和map、filter

目录 1、匿名函数: lambda 2、Lambda的参数类型 3、map、 filter 4、本节总结 1、匿名函数: lambda 1)语法: lambda arg1, arg2, …, argN : expression using arg 2) lambda是一个表达式,而不是一个语…

pyqt5+yolo模型+多线程

界面开发 开发主窗口界面 from PyQt5 import QtWidgets from PyQt5 import QtCore,QtGui import sysclass MainWindow(QtWidgets.QMainWindow):def __init__(self):super().__init__()self.initUI()self.toolbar()# 创建菜单栏def initUI(self):menubar self.menuBar()file_m…

交通流量预测:基于交通流量数据建立模型

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

[Java]微服务配置管理

介绍 代码拆分为微服务后, 每个服务都有自己的配置文件, 而这些配置文件中有很多重复的配置, 并且配置变化后需要重启服务, 才能生效, 这样就会影响开发体验和效率 配置管理服务可以帮助我们集中管理公共的配置, 并且nacos就可以实现配置管理服务 配置共享 我们可以把微服务共…

【C++】入门【三】

本节目标 一、类的6个默认成员函数 二、 构造函数 三、析构函数 四、拷贝构造函数 五、赋值运算符重载 六、const成员函数 七、取地址及const取地址操作符重载 一、类的6个默认成员函数 如果类里一个成员都没有,简称空类空类中真的什么都没有吗?并不不是…

D78【 python 接口自动化学习】- python基础之HTTP

day78 pycharm创建项目并进行接口请求 学习日期:20241124 学习目标:http定义及实战 -- pycharm创建项目并进行接口请求 学习笔记: 安装requests 安装方式:pip/pip3 install requests 官网教程:Requests: HTTP fo…

UE5 实现组合键触发事件的方法

因为工作原因。 需要用大括号{和}来触发事件 但是在蓝图中搜了一下,发现键盘事件里根本就没有{}这两个键。 花费了一下午,终于找到解决的方法了,也就是增强输入的弦操作 首先创建一个项目 纯蓝图或者C都可行 进入到内容浏览器的默认页面 …

rabbitmq原理及命令

目录 一、RabbitMQ原理1、交换机(Exchange)fanoutdirecttopicheaders(很少用到) 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…

硬件基础22 反馈放大电路

目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…

新型大语言模型的预训练与后训练范式,苹果的AFM基础语言模型

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…

网络知识1-TCP/IP模型

从用户端到服务端,tcp/ip模型可分为应用层、传输层、网络层、网络接口层 以下使用寄快递为例进行解释 应用层职责: 只关注与为用户提供应用功能,如HTTP、FTP、telnet、DNS、SMTP等 ,应用层的职责就像我们寄快递时将快递给快递员…

【计算机视觉】图像基本操作

1. 数字图像表示 一幅尺寸为MN的图像可以用矩阵表示,每个矩阵元素代表一个像素,元素的值代表这个位置图像的亮度;其中,彩色图像使用3维矩阵MN3表示;对于图像显示来说,一般使用无符号8位整数来表示图像亮度&…

爬虫与反爬-旋转验证码突破方案(知名短视频、TK海外版 及 某东等等)

概述:文本对旋转验证码进行了突破及讲述了实现原理,代码使用纯算法 OpenCV,使用代价较小同时不用安装一大堆AI训练相关的模组,方便且能够快速上手 当前亲自验证了能够支持的网站:国内知名短视频平台、海外版 以及 某东…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能,基于 ARM Corte…