前言¶
本项目基于Google MediaPipe和Android CameraX技术栈,实现了一个高性能的实时手势识别Android应用。项目采用了MediaPipe最新的Gesture Recognition API,支持多种手势类型的识别,包括竖大拇指、胜利手势、张开手掌等常见手势,同时具备实时手部关键点检测和绘制功能。应用使用前置摄像头进行实时手势识别,能够准确检测和分类用户的手势动作,并在界面上实时显示识别结果和置信度分数。
本项目不仅适用于手势识别相关的研究和开发,也可以作为MediaPipe在Android平台应用的实践参考,特别是对于想要学习计算机视觉、手势识别以及Android Camera开发的开发者来说,具有很高的参考价值。
项目特性¶
- 实时手势识别:基于MediaPipe Gesture Recognition模型,支持7种常见手势类型
- 手部关键点检测:实时检测并绘制21个手部关键点和骨架连接线
- 多手检测:支持同时检测多个手部(可自定义数量)
- 高性能推理:使用CPU推理,保证在各种设备上的兼容性和稳定性
- 实时绘制:自定义OverlayView实现手部关键点和识别结果的实时绘制
- 相机集成:基于CameraX实现相机预览和图像分析
- 权限管理:完善的相机权限申请和处理机制
技术架构:
- MediaPipe: Google开源的机器学习框架,提供高效的手势识别能力
- CameraX: Android Jetpack相机库,简化相机操作和生命周期管理
- 自定义绘制: 基于Canvas的实时绘制系统,支持手部关键点和识别结果可视化
- 多线程处理: 后台线程处理图像分析,避免阻塞UI线程
官方模型支持的手势类型¶
MediaPipe官方支持手势识别模型支持以下7种手势:
| 手势名称 | 英文名称 | 描述 | 应用场景 |
|---|---|---|---|
| 👍 | Thumb_Up | 竖起大拇指 | 点赞、确认 |
| 👎 | Thumb_Down | 向下大拇指 | 不赞同、否定 |
| ✌️ | Victory | 胜利手势 | 拍照、胜利表示 |
| 🤟 | ILoveYou | 我爱你手势 | 表达情感 |
| ✊ | Closed_Fist | 握拳 | 抓取、确认 |
| ✋ | Open_Palm | 张开手掌 | 停止、展示 |
| 👉 | Pointing_Up | 向上指 | 指示、选择 |
使用自定义模型¶
参考我上一篇文章《MediaPipe自定义手势识别训练模型》训练自定义模型,获取custom_gesture_recognizer.task模型文件,放在assets/目录下,然后修改GestureRecognizerHelper中的MODEL_FILE参数
项目介绍¶
下面是项目核心代码路径。
app/src/main/java/com/yeyupiaoling/gesturerecognizer/
├── MainActivity.java # 主活动类,负责相机集成和生命周期管理
├── GestureRecognizerHelper.java # MediaPipe手势识别封装类,核心识别逻辑
└── OverlayView.java # 自定义绘制视图,实现手部关键点和结果绘制
app/src/main/assets/
└── gesture_recognizer.task # MediaPipe预训练模型文件
- 下面是该项目简单数据流程图

- 下面是项目核心依赖的库,在
app/build.gradle中配置。
dependencies {
// MediaPipe手势识别
implementation 'com.google.mediapipe:tasks-vision:0.10.14'
// CameraX依赖
implementation 'androidx.camera:camera-core:1.3.4'
implementation 'androidx.camera:camera-camera2:1.3.4'
implementation 'androidx.camera:camera-lifecycle:1.3.4'
implementation 'androidx.camera:camera-view:1.3.4'
}
- 下面是项目核心参数调优,在
GestureRecognizerHelper.java中配置。
可在GestureRecognizerHelper.java中调整以下参数:
// 手部检测置信度(0.0-1.0)
private final float minHandDetectionConfidence = 0.5f;
// 手部跟踪置信度(0.0-1.0)
private final float minHandTrackingConfidence = 0.5f;
// 手部存在置信度(0.0-1.0)
private final float minHandPresenceConfidence = 0.5f;
// 最大检测手数(1-2)
private final int maxNumHands = 2;
演示截图¶

获取源码¶
在公众号中回复【手势识别Android项目源码】即可获取源码。