RTSP映像とは
RTSP(Real Time Streaming Protocol)映像とは、ネットワーク経由でリアルタイムに動画を配信・再生するためのプロトコルを利用した映像のことです。主に監視カメラやストリーミングサービスで使用され、低遅延で映像を送受信できます。
骨格推定とは
骨格推定(Pose Estimation)とは、画像や動画から人の関節の位置を推定し、体の姿勢を分析する技術です。AIや機械学習を活用し、肩・肘・膝などの関節の座標を特定し、姿勢を認識します。スポーツの動作解析やゲーム、フィットネスアプリなど、さまざまな分野で使われています。

画像引用元 : 姿勢推定技術 – Global Walkers
Visual Studio Codeをインストールする

https://code.visualstudio.com/download
Local Disk(C:)内にファイルを作成します。
Local Disk(C:)>test>run.py
Cドライブに保存しない場合、正常に動かないことがある。
環境をつくる
VScodeのターミナルにて
仮想環境の作成
py -3.10 -m venv venv
仮想環境を有効化
(PowerShell の場合)
venvScripts\Activate
(コマンドプロンプトの場合)
venv\Scripts\activate.bat
(Git Bash or WSL の場合)
source venv/bin/activate
必要なライブラリをインストール
・MediaPipe を使った骨格推定
pip install opencv-python mediapipe numpy matplotlib
使用可能なカメラを探す
Visual Studio Code内でファイルを開きコードを書いて保存します。
コード
import cv2
for i in range(10): # 0~9のIDを試す
cap = cv2.VideoCapture(i)
if cap.isOpened():
print(f"カメラ {i} が使用可能")
cap.release()
Code language: PHP (php)
デバック
PS C:\test> python ./search.py
カメラ 0 が使用可能
カメラ 1 が使用可能
VScode内のターミナルにてコードを実行すると
カメラ0がPC内蔵のインカメラで、カメラ1がPC内蔵のアウトカメラだった。
今回はインカメラを使用するため、値を(0)に設定する。
search.pyで保存
骨格推定 本文コード
import cv2
import mediapipe as mp
# MediaPipe Poseのセットアップ
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()
mp_draw = mp.solutions.drawing_utils
# RTSPストリームのキャプチャ
cap = cv2.VideoCapture(0) #0がインカメラ,1がアウトカメラ
if not cap.isOpened():
print("エラー:RTSPストリームを開けませんでした。")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("エラー:RTSPストリームからフレームを読み取れませんでした。")
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()
Code language: PHP (php)
run.py で保存
実行
VScode下部のターミナルにて実行する。 python ./run.py
実行をすると自動でPose Estimationが開き、映像が映された。
