前言

本項目基於Google MediaPipe和Android CameraX技術棧,實現了一個高性能的即時手勢識別Android應用。項目採用了MediaPipe最新的Gesture Recognition API,支持多種手勢類型的識別,包括豎大拇指、勝利手勢、張開手掌等常見手勢,同時具備即時手部關鍵點檢測和繪製功能。應用使用前置攝像頭進行即時手勢識別,能夠準確檢測和分類用戶的手勢動作,並在界面上即時顯示識別結果和置信度分數。

本項目不僅適用於手勢識別相關的研究和開發,也可以作爲MediaPipe在Android平臺應用的實踐參考,特別是對於想要學習計算機視覺、手勢識別以及Android Camera開發的開發者來說,具有很高的參考價值。

項目特性

  1. 即時手勢識別:基於MediaPipe Gesture Recognition模型,支持7種常見手勢類型
  2. 手部關鍵點檢測:即時檢測並繪製21個手部關鍵點和骨架連接線
  3. 多手檢測:支持同時檢測多個手部(可自定義數量)
  4. 高性能推理:使用CPU推理,保證在各種設備上的兼容性和穩定性
  5. 即時繪製:自定義OverlayView實現手部關鍵點和識別結果的即時繪製
  6. 相機集成:基於CameraX實現相機預覽和圖像分析
  7. 權限管理:完善的相機權限申請和處理機制

技術架構:

  • 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預訓練模型文件
  • 下面是該項目簡單數據流程圖

wechat_2025-07-05_110216_759.png

  • 下面是項目核心依賴的庫,在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項目源碼】即可獲取源碼。

小夜