Python | OpenCV 專案:MediaPipe 手勢控制應用
📚 前言
在上一篇 小型圖片分類專案 中,我們完成了端對端的圖片分類系統。
這一篇介紹 MediaPipe 手勢控制應用。MediaPipe 是 Google 開發的跨平台機器學習管線框架,其中的 Hands 模組可以即時偵測手部的 21 個關鍵點,不需要 GPU,精度遠高於傳統輪廓法。
🎯 專案目標
- 使用 MediaPipe Hands 偵測手部關鍵點
- 實作手指計數(0 ~ 5)
- 自訂手勢辨識(OK、Rock、拳頭等)
- 整合互動應用:手勢控制螢幕畫筆
🛠️ 套件安裝
1 | pip install mediapipe |
🔎 MediaPipe Hands 關鍵點說明
MediaPipe Hands 會回傳手部 21 個關鍵點(Landmark),每個點有 x、y(相對比例)與 z(深度):
1 | 8 12 16 20 |
| 關鍵點 | 位置 |
|---|---|
| 0 | 手腕 |
| 1~4 | 大拇指(4 = 指尖) |
| 5~8 | 食指(8 = 指尖) |
| 9~12 | 中指(12 = 指尖) |
| 13~16 | 無名指(16 = 指尖) |
| 17~20 | 小指(20 = 指尖) |
💻 基本手部偵測
使用 MediaPipe Hands 偵測手部 21 個關鍵點,即時繪製骨架連線並顯示於攝影機畫面
1 | # detect_hands.py |
💻 手指計數
比較各手指指尖與第二關節的座標判斷每根手指是否伸直,回傳伸出的手指數量
1 | # demo_count_fingers.py |
💻 手勢辨識
根據關鍵點幾何關係辨識拳頭、讚、剪刀、OK、五指張開等特定手勢並回傳對應名稱
1 | # demo_recognize_gesture.py |
💻 完整互動應用:手勢畫筆
伸出食指時在畫布上繪製軌跡,握拳時清除畫布,將手勢繪圖疊加在攝影機畫面上顯示
用手勢控制螢幕畫筆,食指繪圖、拳頭清除畫布:
1 | # gesture_painter.py |
⚠️ 注意事項
cv2.flip(frame, 1)水平翻轉很重要:不翻轉的話,MediaPipe 回傳的 Left/Right 與畫面方向相反,大拇指方向判斷會錯誤。- MediaPipe 的
handedness是鏡像判斷:對著攝影機時,MediaPipe 判斷的「右手」實際上是你的左手(因為是鏡像)。翻轉畫面後就正確了。 z值可用於判斷手指深度:若需要更精細的手勢(例如區分手掌朝前/朝後),可利用z值輔助判斷。- 在黑暗環境效果較差:MediaPipe Hands 依賴 RGB 畫面,光線不足時偵測率會下降。
🎯 結語
MediaPipe Hands 提供了高精度、低延遲的手部關鍵點偵測,讓複雜的手勢辨識只需要幾何計算就能完成,不需要另外訓練模型。
下一個專案是 天堂私服 YOLOv8 物件偵測實戰,把 YOLOv8 訓練技術應用在遊戲場景中。
📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。
