前言¶
本項目基於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項目源碼】即可獲取源碼。