前回の記事(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は簡単にいろんなデータを取得することができて、便利ですね。