1.1 ソリューション API、パラメーター
API/パラメータ |
説明する |
STATIC_IMAGE_MOD |
デフォルトはFalseで、入力イメージをビデオ ストリームとして扱います。最初の画像内で最も目立つ人物を検出し、検出に成功した後はポーズのランドマークをさらに特定しようとします。後続の画像では、ターゲットの追跡が失われるまで、別の検出を呼び出すことなく、単にそれらのランドマークを追跡するだけで、計算と待ち時間を削減できます。Trueの場合、人物検出メソッドは各入力画像に対して実行されます。これは、静的で無関係な画像のバッチを処理するのに非常に適しています。 |
MODEL_COMPLEXITY |
デフォルトは 1 で、姿勢ランドマーク モデルの複雑さは 0、1、2 です。一般に、ランドマークの精度と推論レイテンシーは、モデルが複雑になるにつれて増加します。 |
スムーズランドマーク |
デフォルトは True で、画像を滑らかにし、さまざまな入力画像のポーズ ランドマークをフィルタリングしてジッターを軽減しますが、static_image_mode も True に設定されている場合は無視されます。 |
上半身のみ |
デフォルトは False で、上半身のランドマークのみを検出するかどうかを指定します。人体の姿勢には 33 個のランドマーク、上半身の姿勢には 25 個のランドマークがあります。 |
セグメンテーションを有効にする |
デフォルトは False です。true に設定すると、ソリューションはポーズ ランドマークに加えてセグメンテーション マスクを生成します。 |
スムーズセグメンテーション |
デフォルトは True で、さまざまな入力イメージのセグメンテーション マスクをフィルタリングしてジッターを低減しますが、enable_segmentation が False に設定されている場合、または static_image_mode が True に設定されている場合は無視されます。 |
min_tracking_confidence |
デフォルトは 0.5 です。正常に追跡されたとみなされる姿勢ランドマークのランドマーク追跡モデルからの最小信頼値 (0 ~ 1)。それ以外の場合は、次の入力画像で人物検出が自動的に呼び出されます。より高い値に設定すると、ソリューションの堅牢性が向上しますが、待ち時間が長くなります。static_image_mode が True の場合、人物検出はすべての画像フレームで実行されます。 |
min_detection_confidence |
デフォルトは 0.5 で、人物検出モデルの最小信頼値 (0 ~ 1 の間) です。しきい値がこのしきい値より高い場合、検出は成功したとみなされます。 |
1.2 重要な点と接続を描画する
1.2.1 API
- mediapipe.solutions.drawing_utils.draw_landmarks()
mediapipe.solutions.drawing_utils はモジュールです。最初にモジュールのエイリアスを作成してから、特定の操作を実行できます。
mp_drawing = mp.solutions.drawing_utils
mp_drawing.draw_landmarks()
1.2.2 関数パラメータ
パラメータ |
説明する |
画像 |
描かなければならない原画 |
ランドマークリスト |
検出されたキーポイント座標 (results.pose_landmarks) |
接続 |
接続線はこれらの座標を接続する必要があります (mpPose.POSE_CONNECTIONS)。このパラメータが渡されない場合、接続されません。 |
ランドマーク_図面_仕様 |
座標の色と太さ |
接続図面仕様 |
接続線の太さや色など |
results = pose.process(image)
mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS)
1.3 姿勢関節点追跡カプセル化モジュール
mpPose = mp.solutions.pose
pose = mpPose.Pose(static_image_mode=False,
smooth_landmarks=True,
min_detection_confidence=0.5,
min_tracking_confidence=0.5)
1.4 33 個の関節点の座標を表示する
1.4.1 33 関節点パラメータ名
class PoseLandmark(enum.IntEnum):
"""The 33 pose landmarks."""
NOSE = 0
LEFT_EYE_INNER = 1
LEFT_EYE = 2
LEFT_EYE_OUTER = 3
RIGHT_EYE_INNER = 4
RIGHT_EYE = 5
RIGHT_EYE_OUTER = 6
LEFT_EAR = 7
RIGHT_EAR = 8
MOUTH_LEFT = 9
MOUTH_RIGHT = 10
LEFT_SHOULDER = 11
RIGHT_SHOULDER = 12
LEFT_ELBOW = 13
RIGHT_ELBOW = 14
LEFT_WRIST = 15
RIGHT_WRIST = 16
LEFT_PINKY = 17
RIGHT_PINKY = 18
LEFT_INDEX = 19
RIGHT_INDEX = 20
LEFT_THUMB = 21
RIGHT_THUMB = 22
LEFT_HIP = 23
RIGHT_HIP = 24
LEFT_KNEE = 25
RIGHT_KNEE = 26
LEFT_ANKLE = 27
RIGHT_ANKLE = 28
LEFT_HEEL = 29
RIGHT_HEEL = 30
LEFT_FOOT_INDEX = 31
RIGHT_FOOT_INDEX = 32
1.4.2 ある関節点の座標を確認する
results = pose.process(image)
for index, lm in enumerate(results.pose_landmarks.landmark):
"""
x: 0.42567315697669983
y: 4.285938739776611
z: 0.28193268179893494
visibility: 0.001105456380173564
"""
h, w, c = img.shape
cx, cy = int(lm.x * w), int(lm.y * h)
print(index, cx, cy)
1.4.3 xy スケール座標をピクセル座標に変換する
- 直接生成した座標値は小さすぎるため、画像のピクセルサイズ単位に変換できます。
h, w, c = img.shape
cx, cy = int(lm.x * w), int(lm.y * h)
1.5 FPS の表示
1.5.1 FPS の表示
cTime = time.time()
fps = 1/(cTime-pTime)
pTime = cTime
1.5.2 画像に FPS を表示する
cv2.putText(img, str(int(fps)), (70,50), cv2.FONT_HERSHEY_PLAIN, 3, (255,0,0), 3)