見出し画像

PYTHONでサッカープレイヤーをトラッキングしてモザイク処理をする

こんにちは

今回はPYTHONで動画の一部を切り取り
サッカープレイヤーをトラッキングして
さらに人物にモザイクをかける処理をしてみます。


特定の12秒間の動画にして保存

Google Driveのマウント

  • google.colabのdriveモジュールを使って、Google DriveをColabにマウントします。

from google.colab import drive
drive.mount('/content/drive')

動画の読み込みとトリミング

 MoviePy

MoviePyはPythonで動画の編集や処理を簡単に行えるライブラリです。動画の読み込み、カット、結合、フィルター適用などが可能です。

  • VideoFileClip: 動画ファイルを読み込むためのクラス。

  • subclip(start_time, end_time): 動画の一部を切り出すための関数。

  • write_videofile: 編集後の動画を保存するための関数。

import moviepy.editor as mp


# 動画のトリミング処理(開始3秒から15秒の12秒間)
input_video_path = '/content/drive/My Drive/Project_folder/soccer/origin_soccer.MP4'
output_trimmed_path = '/content/drive/My Drive/Project_folder/soccer/origin_soccer_12sec.MP4'

# MoviePyで動画を読み込む
clip = mp.VideoFileClip(input_video_path)

# 3秒から15秒までのクリップを作成
trimmed_clip = clip.subclip(3, 15)

# トリミングした動画を保存
trimmed_clip.write_videofile(output_trimmed_path, codec='libx264')

origin_soccer_12sec.MP4が完成!


サッカー動画のプレイヤーにモザイクをかける

  1. YOLOモデルの準備

    • 人物検出のためにYOLOなどの物体検出モデルを使用して、人間を検出します(例: YOLOv8)。

    • Colab上でYOLOv8をインストールし、検出モデルをロードします。

      • YOLO('yolov8n.pt'): 事前学習されたYOLOv8のニューラルネットワークモデル(yolov8n.pt)をロードします。yolov8nはYOLOv8のn(nano)バージョンで、速度重視の軽量モデルです。

      • model(frame): 動画のフレームをモデルに渡して推論を行い、人物や物体を検出します。frameには現在のフレームの画像データが含まれており、これをモデルに入力して検出結果を得ます。

      • results.xyxy: YOLOの推論結果の座標情報(バウンディングボックスの左上と右下の座標)を取得します。ここで検出された人物や物体の位置情報を使って、モザイク処理を行います

  2. モザイク処理

    • 人物を検出した後、その領域に対してモザイクをかけます。

    • モザイク処理は、OpenCVの関数(cv2.blur()やcv2.resize())を使用し

      • cv2.resize(): 画像のリサイズを行う関数。モザイクを作る際に使用します。

      • cv2.VideoCapture(): 動画ファイルをフレームごとに読み込むための関数。

      • cv2.VideoWriter_fourcc(*'mp4v'): 処理後の動画をエンコーディングして保存するための関数。ここでは、mp4vコーデックを使っています

  3. モザイクの方法

    1. 縮小: 画像(もしくはその一部)を極端に小さなサイズに縮小します。例えば、(x2 - x1, y2 - y1)サイズの領域を、(10, 10)などの小さなサイズにリサイズします。

    2. 再拡大: 縮小した画像を元のサイズにリサイズします。この際、ピクセルは均一な色で埋められるため、ブロック状の「モザイク」がかかった状態になります。

  4. 出力動画の保存:

    • 処理後の動画をGoogle Driveに保存します。

# 必要なライブラリのインポート
import cv2
from ultralytics import YOLO

# YOLOv8nのモデルをロード
model = YOLO('yolov8n.pt')

# 動画の読み込み
input_video_path = '/content/drive/My Drive/Project_folder/soccer/origin_soccer_12sec.MP4'
output_mosaic_path = '/content/drive/My Drive/Project_folder/soccer/mosaic_soccer_12sec.MP4'

cap = cv2.VideoCapture(input_video_path)

# 動画の設定を取得
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_mosaic_path, fourcc, 20.0, (int(cap.get(3)), int(cap.get(4))))

# フレームごとに処理を行う
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # YOLOv8で人物を検出
    results = model(frame)

    # 検出された人物に対してモザイクをかける
    for box in results[0].boxes:  # 検出結果のバウンディングボックス
        x1, y1, x2, y2 = map(int, box.xyxy[0])  # バウンディングボックスの座標
        region = frame[y1:y2, x1:x2]  # 検出された領域を取得

        # モザイク処理(縮小して再度拡大する)
        mosaic_region = cv2.resize(region, (10, 10))  # 縮小
        mosaic_region = cv2.resize(mosaic_region, (x2 - x1, y2 - y1), interpolation=cv2.INTER_LINEAR)  # 元のサイズに戻す
        frame[y1:y2, x1:x2] = mosaic_region  # モザイク領域をフレームに反映

    # 処理したフレームを出力動画に書き込む
    out.write(frame)

# リソースの解放
cap.release()
out.release()
cv2.destroyAllWindows()




結果


今回は

 MoviePyを動画を短くして保存
YOLOモデルでサッカー選手をトラッキング
OpenCVでフレームごとの選手の画像をモザイク処理
ができました!

つぎはアフィン変換ホモグラフィ変換で選手の座標を取得し、2D平面への変換にチャレンジします!


この記事が気に入ったらサポートをしてみませんか?