Mediapipeはジェスチャートラッキングを実装します
環境:python3.8、pycharm2020
ハードウェア:Logitech c505e
メディアパイプの手
公式ウェブサイト情報:https
: //google.github.io/mediapipe/solutions/hands.html Mediapipeは、Googleがオープンソースとする機械学習ライブラリであり、顔認識とジェスチャ認識のソリューションがいくつかあり、次のような言語を提供します。 pythonおよびjsパッケージ。
MediaPipe Handsは、忠実度の高い手と指の追跡ソリューションです。機械学習(ML)を使用して、1つのフレームから21の主要な3D手の情報を推測します。これを使用して、手のキーポイントの座標を抽出できます。キーポイントには、次のように番号が付けられています。
簡単なジェスチャー追跡の例:
公式ウェブサイトのドキュメントによると、簡単なジェスチャー追跡の例をすばやく実装できます。
import cv2
import mediapipe as mp
import time
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils
# 帧率统计
pTime = 0
cTime = 0
while True:
success, img = cap.read()
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#转换为rgb
results = hands.process(imgRGB)
print(results.multi_hand_landmarks)
if results.multi_hand_landmarks:
for handLms in results.multi_hand_landmarks:
for id, lm in enumerate(handLms.landmark):
print(id, lm)
# 获取手指关节点
h, w, c = img.shape
cx, cy = int(lm.x*w), int(lm.y*h)
cv2.putText(img, str(int(id)), (cx+10, cy+10), cv2.FONT_HERSHEY_PLAIN,
1, (0, 0, 255), 2)
mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
# 统计屏幕帧率
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)
cv2.imshow("image", img)
if cv2.waitKey(2) & 0xFF == 27:
break
cap.release()
実際の効果を図に示します。
ここでのフレーム数は、カメラのフレームレートによって制限されます。
部分的なAPI分析
手の初期構成
Handsの初期設定がhands = mpHands.Hands()
完了しました。以下のコンストラクターから、設定できる初期化パラメーターを確認できます。
def __init__(self,
static_image_mode=False,
max_num_hands=2,
min_detection_confidence=0.5,
min_tracking_confidence=0.5):
- static_image_modeは静止画像モードで、デフォルトはfalseで、ビデオの処理に使用されます
- max_num_handsは、検出するためにサポートされているハンドの最大数です。
- 後者の2つは、検出と追跡の信頼度のしきい値(確率論に関連する知識)である必要があります。信頼度が値よりも小さい場合、画像は再処理されます。値が大きいほど、結果はより正確になります。
ジェスチャー情報の収集
results = hands.process(imgRGB)
画像の処理が完了したら、ここでの入力はRGB形式である必要があることに注意してください。
手を検出すると、21個のマーカーポイントのx、y、z値を含むリストが返されます
- xとyの範囲は[0.1、1]であり、画像の幅と高さを乗算することで特定のピクセル座標を取得できます。
- zは深度であり、値が小さいほど、座標点がカメラに近くなります。
results.multi_hand_landmarks
は、検出されたすべての手のリストです。このリストにアクセスすることで、各手の対応するフラグに関する情報を取得できます。具体的な例は次のとおりです。各フラグのピクセル座標を取得できます。
if results.multi_hand_landmarks:
for handLms in results.multi_hand_landmarks:
for id, lm in enumerate(handLms.landmark):
print(id, lm)
# 获取手指关节点
h, w, c = img.shape
cx, cy = int(lm.x*w), int(lm.y*h)
cv2.putText(img, str(int(id)), (cx+10, cy+10), cv2.FONT_HERSHEY_PLAIN,
1, (0, 0, 255), 2)
特定のランドマークの抽出
上記の紹介により、4つのマーカーポイント(つまり、親指)の情報を取得するなど、特定のマーカーポイントの座標を簡単に取得できます。
print(handLms.landmark[4])
関連リンク
https://www.youtube.com/watch?v=9iEPzbG-xLE
https://google.github.io/mediapipe/solutions/hands.html
ジェスチャ認識など、Mediapipeに基づくいくつかのアプリケーションを共有します
。1。ジェスチャ認識コードの接続