基于MediaPipe和传统机器学习的手势识别
一、项目介绍手势识别是一种常见的计算机视觉应用可以通过摄像头获取手部图像再根据手部的关键点位置判断当前手势。本次项目使用 OpenCV 获取摄像头画面使用 MediaPipe 检测手部关键点然后将关键点的三维坐标转换成机器学习模型可以处理的特征最后使用传统机器学习算法完成手势分类和实时识别。整个项目主要分为两个部分第一部分负责采集手势数据第二部分负责训练分类模型并进行实时识别。程序中设置了 6 种手势类别分别是拳头、张开手、指向、剪刀手、OK 手势。数据采集程序会将每个手势的关键点信息保存为 JSON 文件为后续模型训练提供数据。二、MediaPipe手部关键点检测程序首先导入 OpenCV、MediaPipe、NumPy、os 和 json 等库其中 OpenCV 主要负责摄像头和图像处理MediaPipe 用于手部检测NumPy 用于数据处理json 用于保存采集的数据。MediaPipe 手部模型可以检测手部的 21 个关键点。程序设置with mp_hands.Hands( static_image_modeFalse, max_num_hands1, min_detection_confidence0.7, min_tracking_confidence0.7) as hands:其中max_num_hands1表示一次最多检测一只手min_detection_confidence0.7是手部检测置信度阈值min_tracking_confidence0.7是手部跟踪置信度阈值。摄像头获取的图像默认是 BGR 格式而 MediaPipe 处理图像时使用 RGB 格式因此程序先使用image cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results hands.process(image)完成颜色空间转换和手部检测之后再转换回 BGR 格式用于 OpenCV 显示。当检测到手部以后可以通过hand_landmarks.landmark获取 21 个关键点。每一个关键点都包含x、y和z三个坐标值landmarks [] for lm in hand_landmarks.landmark: landmarks.append([lm.x, lm.y, lm.z])因此一只手最终可以得到21 × 3 63 个特征值。同时程序使用draw_landmarks()将关键点以及手部连接线绘制到摄像头画面上方便观察检测效果。三、手势数据采集为了训练机器学习模型需要先建立手势数据集。程序根据不同手势创建对应的文件夹DATA_DIR gesture_data for cls in GESTURE_CLASSES.values(): os.makedirs(os.path.join(DATA_DIR, cls), exist_okTrue)这样会形成不同的手势类别目录每个目录中保存对应手势的 JSON 数据。程序通过键盘数字控制数据采集。例如按下对应数字键后如果摄像头检测到了手部就会把当前手势的关键点保存下来。保存的数据主要包括四部分data { class: cls_name, class_index: cls_idx, landmarks: landmarks, timestamp: str(np.datetime64(now)) }其中class表示手势名称class_index表示手势对应的数字编号landmarks保存 21 个关键点的三维坐标timestamp保存数据采集时间。使用 JSON 保存数据的好处是结构比较清晰而且后续读取时比较方便。这样原始的手部图像最终被转换成了结构化的关键点数据。四、将关键点转换为机器学习特征第二个程序首先遍历不同手势类别对应的文件夹然后读取其中的 JSON 文件for cls_idx, cls_name in GESTURE_CLASSES.items(): cls_dir os.path.join(DATA_DIR, cls_name)读取 JSON 后将其中的 21 个关键点展开成一个一维特征向量landmarks data[landmarks] feature_vector [] for lm in landmarks: feature_vector.extend(lm)每个关键点包含三个数据因此最终一个样本具有 63 维特征21 个关键点 × 3 个坐标 63 维。所有样本组成特征矩阵X对应的手势类别组成标签数组y。这种方法相比直接使用原始图片进行训练更加简单因为模型不需要直接处理大量像素而是直接学习手部关键点之间的空间关系。五、划分数据集和特征标准化得到数据之后程序使用train_test_split()将数据划分为训练集和测试集X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy )其中test_size0.2表示 20% 的数据作为测试集剩余 80% 用于训练。random_state42用于保证每次划分结果具有一定的可重复性stratifyy可以让训练集和测试集中各类别的比例保持相对一致。之后使用StandardScaler对特征进行标准化scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)这里需要注意标准化器只在训练集上执行fit然后使用相同的标准化规则处理测试集。这可以保证训练和测试时的数据处理方式一致。程序还使用joblib.dump()将标准化器保存成scaler.pkl方便实时识别时使用相同的特征处理方式。六、多种传统机器学习模型为了比较不同算法在手势分类任务上的表现程序同时训练了四种传统机器学习模型models { K近邻分类器: KNeighborsClassifier(n_neighbors5), 支持向量机: SVC(kernelrbf, gammascale), 决策树: DecisionTreeClassifier(max_depth10), 随机森林: RandomForestClassifier(n_estimators100) }分别是 K 近邻、支持向量机、决策树和随机森林。K 近邻分类器通过寻找距离较近的样本进行分类支持向量机通过寻找合适的分类边界完成分类决策树通过不断进行条件判断进行分类随机森林则通过多棵决策树共同完成预测。经过测试得出最好的模型是支持向量机测试准确率为0.9833程序依次训练这些模型并通过测试集计算准确率model.fit(X_train_scaled, y_train) y_pred model.predict(X_test_scaled) accuracy accuracy_score(y_test, y_pred)同时使用classification_report()输出分类报告从多个指标观察模型的分类情况。七、选择并保存模型程序通过比较每个模型的测试集准确率记录当前表现较好的模型if accuracy best_accuracy: best_accuracy accuracy best_model model best_model_name name最终使用joblib.dump()保存模型joblib.dump(best_model, best_gesture_model.pkl)因此训练完成后会得到两个重要文件best_gesture_model.pkl保存训练好的手势分类模型scaler.pkl保存特征标准化器这样在之后进行实时识别时就不需要重新训练模型直接加载这两个文件即可。八、使用混淆矩阵分析分类结果除了准确率和分类报告程序还使用混淆矩阵对模型进行进一步分析cm confusion_matrix(y_test, y_pred_best)然后通过 Seaborn 绘制热力图sns.heatmap( cm, annotTrue, fmtd, cmapBlues, xticklabelsGESTURE_CLASSES.values(), yticklabelsGESTURE_CLASSES.values() )混淆矩阵可以观察不同手势之间的预测情况。例如某一种手势经常被预测成另一种手势就可以从矩阵中比较直观地发现。最终图像保存为confusion_matrix.png因此模型评估不仅可以看整体准确率还可以进一步分析具体类别之间的识别情况。九、实时手势识别训练完成以后程序可以进入实时识别模式。首先加载训练好的模型和标准化器model joblib.load(best_gesture_model.pkl) scaler joblib.load(scaler.pkl)然后重新启动摄像头和 MediaPipe 手部检测。实时检测到手部后同样提取 21 个关键点的三维坐标并转换为 63 维特征向量landmarks [] for lm in hand_landmarks.landmark: landmarks.extend([lm.x, lm.y, lm.z])接着使用训练阶段保存的标准化器处理数据landmarks_scaled scaler.transform([landmarks])最后将处理后的特征输入模型prediction model.predict(landmarks_scaled) predicted_class GESTURE_CLASSES[prediction[0]]这样就可以得到当前摄像头画面中的手势类别。如果模型支持predict_proba()程序还会获取各类别的预测概率并把预测结果和概率显示在摄像头画面上display_text f{predicted_class} ({max_prob:.1f}%)最终通过cv2.putText()将识别结果显示出来实现实时手势识别。十、命令行参数程序最后使用argparse实现训练和实时识别两种运行方式parser.add_argument(--train, actionstore_true, help训练模型) parser.add_argument(--recognize, actionstore_true, help实时识别)运行python 程序.py --train可以进行模型训练。运行python 程序.py --recognize可以进入实时手势识别模式。十一、项目流程总结整个手势识别系统可以概括为以下流程摄像头采集图像 → MediaPipe检测手部 → 提取21个关键点 → 获取63维三维坐标特征 → 保存JSON数据 → 划分训练集和测试集 → 特征标准化 → 训练多种机器学习模型 → 测试模型 → 保存模型和标准化器 → 摄像头实时检测 → 提取关键点 → 标准化 → 模型预测 → 显示识别结果。

相关新闻

Excel多表关联神器实测:告别VLOOKUP低效操作,快速合并跨表数据

Excel多表关联神器实测:告别VLOOKUP低效操作,快速合并跨表数据

做数据分析或者报表的人,应该都有过这样的经历:Excel表越堆越多,需要的数据散落在好几个文件里。每次要做月报,先打开销售表,再打开客户表,对着工号或者订单编号一个一个VLOOKUP,辛辛苦苦拉出来…

2026/10/17 15:23:57 阅读更多 →
没Commit数据却同步了?事务提交与自动提交机制全解析

没Commit数据却同步了?事务提交与自动提交机制全解析

"我没 commit,但数据已经同步过去了。"这句话我真的听过太多次。通常是这样的场景:有人半夜改了个配置,或者跑了一段调试脚本,没做任何提交操作,第二天却发现测试环境里表结构变了、别的同事看到了自己刚写进…

2026/10/18 15:48:54 阅读更多 →
用CodeGraph构建代码知识图谱,破解AI编码代理的上下文难题

用CodeGraph构建代码知识图谱,破解AI编码代理的上下文难题

1. 为什么AI编码代理会“看不懂”代码库?1.1 RAG的局限:语义检索解决不了拓扑问题现在做大模型辅助编程的人,基本都绕不开RAG(检索增强生成)。做法也大同小异:把代码切块、向量化、存进向量数据库&#xff…

2026/10/18 8:21:36 阅读更多 →

最新新闻

78B多模态大模型如何落地?InternVL2_5-78B-MPO多卡部署与省显存量化完整攻略

78B多模态大模型如何落地?InternVL2_5-78B-MPO多卡部署与省显存量化完整攻略

【免费下载链接】InternVL2_5-78B-MPO 项目地址: https://ai.gitcode.com/OpenGVLab/InternVL2_5-78B-MPO 点击查看 免费下载 InternVL2_5-78B-MPO 是一款基于 ViT-MLP-LLM 架构的开源多模态大模型,融合了 6B 视觉编码器 InternViT 与 72B 语言模型 Qwe…

2026/10/18 23:08:17 阅读更多 →
定长140字节上报协议n值解析:字段偏移、熵值定位与纯算还原

定长140字节上报协议n值解析:字段偏移、熵值定位与纯算还原

简介:这是一份阿里140-n值纯算生成逻辑的代码解析包,面向反爬虫工程师、前端加密研究者与算法学习者。包内完整呈现n值生成全链路:从自定义base64加密算法入手,逐步拆解Ye、ke、B、u四个核心数组的来源与组装规则,涵盖…

2026/10/18 23:08:17 阅读更多 →
无监督深度单应性估计:PyTorch实战与几何建模原理

无监督深度单应性估计:PyTorch实战与几何建模原理

1. 项目概述:为什么“无监督深度单应性估计”值得你花30分钟认真读完“Unsupervised Deep Homography - Pytorch实现”——这个标题里藏着计算机视觉领域一个非常典型的“理想与现实撕扯点”。单应性(Homography)是什么?简单说&am…

2026/10/18 23:08:17 阅读更多 →
AUBO i5与D435i抓取实践:手眼标定、点云分割与避坑指南

AUBO i5与D435i抓取实践:手眼标定、点云分割与避坑指南

简介:面向机械臂视觉抓取开发者的可运行源码包,整合aubo i5机械臂与Intel RealSense D435i深度相机的识别抓取实践。压缩包仅6KB,内含3个文件,以html说明与inscode工程配置为主,附带gitignore版本管理配置,…

2026/10/18 23:08:17 阅读更多 →
Agent Skill 完全指南:让 AI 智能体“一次学会,处处复用“

Agent Skill 完全指南:让 AI 智能体“一次学会,处处复用“

目录 一、 Agent Skill入门 1.1 Agent Skill 到底是什么? 1.2 Agent Skill长什么样? 1.2.1 文件架构 1.2.2 SKILL.md文件格式 (1) Frontmatter字段 (2) Body content 1.2.3 Skill Demo 二、怎么用Agent Skill? 2.1 安装Agent 2.2 …

2026/10/18 23:08:17 阅读更多 →
推荐一个适合学习AI Agent开发的AI智能体开源项目:用TaoToken统一Key跑通DeepAgent实战

推荐一个适合学习AI Agent开发的AI智能体开源项目:用TaoToken统一Key跑通DeepAgent实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 23:07:17 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →