1 实训选题目的
本次实训选择的题目是“基于树莓派的手势识别系统”,旨在为人们提供一种便捷的交互方式,使用户能够通过手势控制智能设备,摆脱传统的物理按键操作。通过本项目,我们希望能实现快速、灵活的手势识别,提升用户体验和居住环境的智能化水平,我们将能够将所学的人工智能专业知识进行综合应用,包括但不限于Linux操作系统、Python程序设计、人工智能数据处理、机器学习技术及应用、计算机视觉技术、响应式网页设计、创新创业教育、数据库基础、软件工程和人工智能产品开发等。本项目要求小组成员能够灵活运用这些知识,开发出具有一定创新性和实用价值的人工智能产品。
2 实训任务目的
通过本次“手势识别”的实训任务,目的是使团队成员掌握树莓派硬件的基本组成,并能够完成树莓派硬件的搭建、新版64位桌面版系统的烧录安装以及SSH、VNC、用户密码等基础配置。这些步骤将为团队成员提供远程控制树莓派的能力,为后续的温湿度检测系统开发打下坚实的基础。此外,本任务还将帮助团队成员熟悉树莓派的操作系统环境,确保在后续的开发过程中能够有效地进行编程和调试,实现智能家居的各项功能,包括数据采集、处理、存储和可视化展示。通过本实训,学生将学会如何将理论知识应用于实际问题,提高解决实际问题的能力,并增强团队合作和项目管理的技能。
3 实训介绍
(一)必备功能说明:
1.手势识别功能:
通过摄像头实时捕捉用户的手势,使用百度AI手势识别API进行分析。系统支持多种手势的识别,如“点赞”、“OK”、“拳头”等,并在控制台输出识别结果。
2.语音播报功能:
将识别到的手势内容通过百度AI语音合成API生成语音,用户可以通过声音获取识别结果。语音内容使用识别到的手势名称。
3.状态反馈功能:
在识别到的手势区域绘制矩形框,提供视觉反馈,用户可以直观地看到识别结果的位置。
通过本次实训,我们的目标是开发一个功能全面、用户友好且具备一定智能的手势识别系统,增强人机交互的自然性和便利性。
4 实训组件
- 树莓派主板1块
- 树莓派电源适配器1个
- 40P软排线1根
- 温湿度传感器1个
- 面包板1个
- 跳线若干
- 电阻若干(用于温湿度传感器电流限制)
- 杜邦线若干(用于连接面包板上的组件)
- 显示器1个
- SD卡1张
- 网络线1根
- 外壳和保护套1个
- 摄像头
5 实训原理
以下是手势识别的核心工作原理:
- 系统架构:
系统搭建在树莓派上,通过摄像头进行视频捕捉,利用Python及相关库执行手势识别与语音播报。 - 手势捕捉与识别:
使用OpenCV库捕捉用户的手势图像。系统每隔一定帧数(如每5帧)进行处理,保存当前帧,将其转化为可供识别的格式,并调用百度AI手势识别API进行分析。 - 反馈机制:
识别出的手势通过gestures字典映射到具体的名称,并在控制台输出相应的信息。同时,识别结果将通过百度的文本转语音API进行语音播报,用户可以听到实时的反馈信息。 - 状态显示与反馈:
每次识别后,系统在图像上绘制识别区域的矩形框,加强用户对手势识别结果的理解。识别到的手势信息也通过文本形式展示在控制台,方便开发调试和用户观察。 - 数据处理:
手势识别结果进行动态处理,拼接识别的多个手势形成综合反馈,用于语音合成。通过适当的控制确保每次处理后的反馈有效传达给用户,同时处理错误情况(如未识别到手势)。
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.