当前位置: 首页 > news >正文

5步搞定AI手势识别API:Flask后端+彩虹骨骼可视化部署教程

5步搞定AI手势识别API:Flask后端+彩虹骨骼可视化部署教程

1. 引言

1.1 学习目标

本教程将带你快速搭建一个基于MediaPipe Hands模型的手势识别API服务,包含以下核心内容:

  • 5分钟内完成环境配置与依赖安装
  • 实现Flask后端API接口开发
  • 集成彩虹骨骼可视化功能
  • 一键测试与部署方案
  • 常见问题排查指南

1.2 前置准备

只需具备:

  • 基础Python编程能力
  • 能运行命令行的电脑(Windows/Mac/Linux均可)
  • 无需GPU,普通CPU即可流畅运行

1.3 项目亮点

  • 极简部署:所有依赖内置,无需额外下载模型
  • 炫酷效果:独家彩虹骨骼可视化,五指分色显示
  • 开箱即用:完整代码可直接复制使用
  • 性能优异:单张图片处理仅需50-100ms

2. 环境配置与快速启动

2.1 创建项目目录

建议按以下结构组织代码:

hand_api/ ├── app.py ├── hand_tracker.py ├── static/ │ └── uploads/ └── requirements.txt

2.2 安装依赖

创建requirements.txt文件并写入:

flask==2.3.3 opencv-python==4.8.0.74 mediapipe==0.10.9 numpy==1.24.3

运行安装命令:

pip install -r requirements.txt

2.3 验证安装

测试MediaPipe是否能正常导入:

import mediapipe as mp print(mp.__version__) # 应输出0.10.9

3. 核心代码实现

3.1 手势检测模块

创建hand_tracker.py文件:

import cv2 import mediapipe as mp import numpy as np class HandTracker: def __init__(self): self.mp_hands = mp.solutions.hands self.hands = self.mp_hands.Hands( static_image_mode=True, max_num_hands=2, min_detection_confidence=0.6 ) # 彩虹颜色配置(BGR格式) self.colors = [ (0, 255, 255), # 黄:拇指 (128, 0, 128), # 紫:食指 (255, 255, 0), # 青:中指 (0, 255, 0), # 绿:无名指 (0, 0, 255) # 红:小指 ] def draw_rainbow_hand(self, image, landmarks): h, w = image.shape[:2] points = [(int(lm.x*w), int(lm.y*h)) for lm in landmarks] # 绘制关节白点 for pt in points: cv2.circle(image, pt, 5, (255,255,255), -1) # 绘制彩色骨骼线 connections = [ (0,1,2,3,4), # 拇指 (0,5,6,7,8), # 食指 (0,9,10,11,12), # 中指 (0,13,14,15,16),# 无名指 (0,17,18,19,20) # 小指 ] for finger_idx, finger in enumerate(connections): for i in range(len(finger)-1): start = finger[i] end = finger[i+1] cv2.line(image, points[start], points[end], self.colors[finger_idx], 2) return image def process(self, image_path): image = cv2.imread(image_path) if image is None: return None rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = self.hands.process(rgb_image) if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: image = self.draw_rainbow_hand(image, hand_landmarks.landmark) return image

3.2 Flask API服务

创建app.py文件:

from flask import Flask, request, jsonify, send_file import os from hand_tracker import HandTracker app = Flask(__name__) tracker = HandTracker() UPLOAD_FOLDER = 'static/uploads' os.makedirs(UPLOAD_FOLDER, exist_ok=True) @app.route('/api/detect', methods=['POST']) def detect_hand(): if 'file' not in request.files: return jsonify({"error": "请上传图片文件"}), 400 file = request.files['file'] if file.filename == '': return jsonify({"error": "未选择文件"}), 400 if file: save_path = os.path.join(UPLOAD_FOLDER, file.filename) file.save(save_path) try: result_img = tracker.process(save_path) if result_img is None: return jsonify({"error": "图片处理失败"}), 400 result_path = save_path.replace('.', '_result.') cv2.imwrite(result_path, result_img) return send_file(result_path) except Exception as e: return jsonify({"error": str(e)}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)

4. 测试与部署

4.1 启动服务

python app.py

服务将在http://localhost:5000启动

4.2 测试API

使用curl测试:

curl -X POST -F "file=@test.jpg" http://localhost:5000/api/detect --output result.jpg

或使用Python代码测试:

import requests url = "http://localhost:5000/api/detect" files = {'file': open('test.jpg', 'rb')} response = requests.post(url, files=files) with open('result.jpg', 'wb') as f: f.write(response.content)

4.3 推荐测试图片

  • 比耶手势(✌️)
  • 点赞手势(👍)
  • 张开手掌(🖐️)
  • 握拳(✊)

5. 常见问题解决

5.1 图片上传失败

现象:返回400错误
解决

  1. 检查文件大小不超过5MB
  2. 确保上传的是JPG/PNG格式
  3. 使用curl -v查看详细请求

5.2 检测不到手部

现象:返回空白图片
解决

  1. 确保手部占据图片主要区域
  2. 尝试调整手部角度(正对手掌效果最佳)
  3. 检查环境光线充足

5.3 性能优化建议

  • 对于视频流,设置static_image_mode=False
  • 如果只需单手检测,设置max_num_hands=1
  • 降低输入图片分辨率(推荐640x480)

6. 总结

6.1 核心成果

通过本教程,你已经完成:

  1. MediaPipe手势识别环境搭建
  2. Flask API服务开发
  3. 彩虹骨骼可视化实现
  4. 完整测试流程验证

6.2 进阶方向

  • 添加手势分类功能(识别特定手势)
  • 扩展为视频流实时处理
  • 开发Web前端交互界面
  • 部署为Docker容器服务

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.cnnetsun.cn/news/1917895.html

相关文章:

  • Janus-Pro-7B WebUI高级功能:批量图片上传、历史对话保存、结果导出PDF
  • cv_unet_image-matting二次开发案例:增加锐化功能与背景模板库
  • Granite-4.0-H-350M工具调用实战:快速集成外部API
  • STM32 FatFS连续写入SD卡数据丢失?3个常见坑点与实战修复方案
  • 写论文软件哪个好|2026 实测对比:虎贲等考 AI 凭全流程合规能力脱颖而出
  • Zig 0.16.0 发布:I/O 接口化重构、增量编译提速 66%,为走向 1.0 奠定基础
  • 储能BMS数据语境化采集架构解析与边缘计算网关选型推荐
  • HunyuanVideo-Foley智能体(Agent)应用:自主音效设计工作流
  • 2026年网络安全防护指南:构建主动、智能、一体化的新一代防御体系
  • 数据防泄密系统是什么?有哪些功能?本文详细介绍防泄密系统
  • Golang如何部署到Kubernetes_Golang K8s部署教程【推荐】
  • RVC变声器终极指南:10分钟训练高质量AI音色模型
  • 【网络安全】Wireshark零基础到进阶学习路线(第三期:核心协议解析,读懂HTTP、TCP、DNS数据包)
  • 万物识别-中文-通用领域镜像与Linux安装教程结合:系统部署指南
  • 会计岗学数据分析的价值分析
  • 希尔伯特变换在机械故障诊断中的包络分析实践
  • CLIP-GmP-ViT-L-14处理工业质检图像:缺陷描述与标准图匹配
  • Vue3+WebRTC实战:10分钟搞定跨浏览器视频聊天室(附完整代码)
  • 保姆级教程:用DiskGenius免费版给你的移动硬盘做个“体检”(附S.M.A.R.T.数据解读)
  • 比PPT更专业!用Visio排列形状功能快速生成卷积核网格(含三维旋转技巧)
  • Phi-3-mini-4k-instruct-gguf:Keil5嵌入式项目开发辅助,代码分析与调试技巧
  • Pixel Couplet Gen实操手册:Streamlit stApp容器重写与像素CSS引擎注入
  • Qt之QGraphicsView交互设计实战
  • 用STM32F103C8T6和OV2640摄像头,从零DIY一个带云台控制的视频监控(附完整源码和PCB)
  • 医用便携超声EFT测试:从原理到PCB布局的实战整改指南
  • 数据降维算法大全:如何用Matlab的drtoolbox实现20+种降维方法(含代码示例)
  • C语言中printf格式化输出函数
  • Qwen3.5-2B多场景:科研论文截图→公式识别→推导过程解释全流程
  • 样本污染、模态漂移、评估幻觉——多模态A/B测试三大隐形杀手全解析,一线大厂已启用防御清单
  • 晶振PCB布局实战:从EMC到热管理的设计避坑指南