fingers count

從網路上下載了很不錯的教學,我把英文版做簡易的中文化,方便我自己未來上課可以使用

這是教學影片 https://www.youtube.com/watch?v=epwlqHHbELE

匯入需要的函式庫與初始化

import cv2

import time

import pygame

import numpy as np

import mediapipe as mp

import matplotlib.pyplot as plt

因為會需要使用到圖片動畫、文字顯示,這個範例很厲害,綜合多種功能於一身

首先,初始化手部標誌檢測模型(Hands Landmarks Detection Model)

我們需要初始化 mp.solutions.hands 這個類別(Class),然後使用適當的參數來設置 mp.solutions.hands.Hands() 函數,並初始化可視化檢測到的地標所需的 mp.solutions.drawing_utils 類(Class),也就是把偵測到的數值繪製顯數出來的Class物件.我們還將處理圖像和視訊,因為要做這些事,所以我們必須設置 mp.solutions.hands.Hands() 函數兩次,一次處理圖像另一次處理視訊。


  • 第一次我們會將參數 static_image_mode 設置為 True 以用於圖像

  • 第二次將 static_image_mode 設置為 False 以用於視訊。

這兩個分別的動作設定會加快Hands Landmarks Detection過程。

mp.solutions.hands是檢測手部關鍵點的函數,其中有4個輸入參數量需要做設定

Configuration Options


  • static_image_mode:

      • 預設值為False,如果設定為false, 就是把輸入看作一個stream,在偵測確定到是手後,開始對手手部追蹤(目標檢測+跟蹤),這次的追蹤跟檢測會持續到找不到手為止,完成這一次的追蹤。

      • 如果設定為True,則對手部檢測將在每個輸入圖像上運行(做目標檢測),這種方式非常適合處理一批靜態的圖片。(如果要做檢測的是圖片就要設置成True)

  • max_num_hands:

      • 可以檢測到的手的數量最大值,預設值是2

  • min_detection_confidence:

      • 手部檢測的最小置信度值,大於這個數值就會被認為是成功的檢測到手。預設值為0.5

  • min_tracking_confidence:

      • 目標蹤模型的最小置信度值,大於這個數值將被視為已成功跟蹤的手部,預設值為0.5,如果static_image_mode設置為true,則忽略此操作。

其中4.8.12.16.20是五跟手指頭的指尖部分(大拇指、食指、中指、無名指和小指的指尖 ),mediapipe能自動辨別左手與右手,剩下的應用就是要寫出數學的演算法,判斷出有幾跟手指頭

結果輸出

  • MULTI_HAND_LANDMARKS:

      • 這個輸出結果包含了檢測與追蹤手的結果,每個手掌可以被檢出21個點的關鍵資訊(如上圖),這些點的資訊是這個點在空間中X,Y,Z座標的數值,簡單把它想像就是我們數學上的空間座標,只是最大的值是1。其中Z的值是以手腕底部為原點的landmark深度值,值愈小,代表愈靠近相機,簡單說就是3D的座標。


  • MULTI_HAND_WORLD_LANDMARKS:

      • 基本上跟MULTI_HAND_LANDMARKS一樣,只是以公尺為單位的3D坐標,它的原點位置位於手部的近似幾何中心。


  • MULTI_HANDEDNESS:

      • 可以檢測到/跟踪的手的慣用手(即是左手還是右手)的資料集合(標籤與概率值)。每隻手都是由標籤和分數組成。

      • Label標籤值是right或left。score是預測的慣用手的估計概率,並且總是大於或等於 0.5(而相反的慣用手的估計概率為 1 - 分數)。