Intern

PCカメラのRTSP映像を骨格推定する

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が開き、映像が映された。