TP-LinkのVIGI C540SのRTSP映像をPythonで取得するして骨格推定する方法 2/2

前回の記事(TP-LinkのVIGI C540SのRTSP映像をPythonで取得するして骨格推定する方法 1/)の続きです。

Pythonコード

前回のRTSPで映像を表示するコードにMediapipeの処理をいれます。

import cv2
import mediapipe as mp

# MediaPipe Poseのセットアップ
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()
mp_draw = mp.solutions.drawing_utils

# RTSPストリームのURL
rtsp_url = "rtsp://username:password@ip_address:port/stream"

# RTSPストリームのキャプチャ
cap = cv2.VideoCapture(rtsp_url)

if not cap.isOpened():
    print("Error: Could not open RTSP stream.")
    exit()

while True:
    ret, frame = cap.read()
    if not ret:
        print("Error: Failed to read frame from RTSP stream.")
        break

    # OpenCVはBGR、MediaPipeはRGBのため変換
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    
    # 骨格推定
    result = pose.process(rgb_frame)

    # 結果の描画
    if result.pose_landmarks:
        mp_draw.draw_landmarks(frame, result.pose_landmarks, mp_pose.POSE_CONNECTIONS)

    cv2.imshow('Pose Estimation', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

結果

このように骨格推定をすることができました。

右手首の座標を表示

今度は右手首の座標を表示させるように修正します。

import cv2
import mediapipe as mp

# MediaPipe Poseのセットアップ
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()
mp_draw = mp.solutions.drawing_utils

# RTSPストリームのURL
#rtsp_url = "rtsp://username:password@ip_address:port/stream"

# RTSPストリームのキャプチャ
cap = cv2.VideoCapture(rtsp_url)

if not cap.isOpened():
    print("Error: Could not open RTSP stream.")
    exit()

while True:
    ret, frame = cap.read()
    if not ret:
        print("Error: Failed to read frame from RTSP stream.")
        break

    # OpenCVはBGR、MediaPipeはRGBのため変換
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    
    # 骨格推定
    result = pose.process(rgb_frame)

    # 結果の描画
    if result.pose_landmarks:
        mp_draw.draw_landmarks(frame, result.pose_landmarks, mp_pose.POSE_CONNECTIONS)

        # 右手首の座標を取得(MediaPipeのランドマークインデックス 16)
        right_wrist = result.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_WRIST]
        nose = result.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE]  # 顔の位置を取得
        h, w, _ = frame.shape  # フレームのサイズ取得
        x, y = int(right_wrist.x * w), int(right_wrist.y * h)  # 画像座標に変換
        nose_x, nose_y = int(nose.x * w), int(nose.y * h)  # 顔の上に表示するための座標取得

        # 座標を顔の上に表示
        cv2.putText(frame, f'Right Wrist: ({x}, {y})', (nose_x, max(nose_y - 30, 30)),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)

    cv2.imshow('Pose Estimation', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

こうすることで、右手首の座標を表示することができます。

まとめ

TP-LinkのVIGI C540SのRTSP映像をPythonで取得するして骨格推定する方法 をご紹介しました。

また、今回は右手首の座標を表示しましたが、Mediapipe Pose Estimationで取得している他の体の部位の座標も同じように表示できます。

あとは、MQTTを使って時系列の右手首の座標の位置をおくり、influxDBなどのDBに格納することで、全体的な時系列データの解析などもすることができます。

Mediapipeは簡単にいろんなデータを取得することができて、便利ですね。