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.txt2.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.txt2.3 验证安装
测试MediaPipe是否能正常导入:
import mediapipe as mp print(mp.__version__) # 应输出0.10.93. 核心代码实现
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 image3.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错误
解决:
- 检查文件大小不超过5MB
- 确保上传的是JPG/PNG格式
- 使用
curl -v查看详细请求
5.2 检测不到手部
现象:返回空白图片
解决:
- 确保手部占据图片主要区域
- 尝试调整手部角度(正对手掌效果最佳)
- 检查环境光线充足
5.3 性能优化建议
- 对于视频流,设置
static_image_mode=False - 如果只需单手检测,设置
max_num_hands=1 - 降低输入图片分辨率(推荐640x480)
6. 总结
6.1 核心成果
通过本教程,你已经完成:
- MediaPipe手势识别环境搭建
- Flask API服务开发
- 彩虹骨骼可视化实现
- 完整测试流程验证
6.2 进阶方向
- 添加手势分类功能(识别特定手势)
- 扩展为视频流实时处理
- 开发Web前端交互界面
- 部署为Docker容器服务
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
