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

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bowen_CV

哇噻,感谢你的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值