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が完成!
サッカー動画のプレイヤーにモザイクをかける
YOLOモデルの準備
人物検出のためにYOLOなどの物体検出モデルを使用して、人間を検出します(例: YOLOv8)。
Colab上でYOLOv8をインストールし、検出モデルをロードします。
YOLO('yolov8n.pt'): 事前学習されたYOLOv8のニューラルネットワークモデル(yolov8n.pt)をロードします。yolov8nはYOLOv8のn(nano)バージョンで、速度重視の軽量モデルです。
model(frame): 動画のフレームをモデルに渡して推論を行い、人物や物体を検出します。frameには現在のフレームの画像データが含まれており、これをモデルに入力して検出結果を得ます。
results.xyxy: YOLOの推論結果の座標情報(バウンディングボックスの左上と右下の座標)を取得します。ここで検出された人物や物体の位置情報を使って、モザイク処理を行います
モザイク処理
人物を検出した後、その領域に対してモザイクをかけます。
モザイク処理は、OpenCVの関数(cv2.blur()やcv2.resize())を使用し
cv2.resize(): 画像のリサイズを行う関数。モザイクを作る際に使用します。
cv2.VideoCapture(): 動画ファイルをフレームごとに読み込むための関数。
cv2.VideoWriter_fourcc(*'mp4v'): 処理後の動画をエンコーディングして保存するための関数。ここでは、mp4vコーデックを使っています
モザイクの方法
縮小: 画像(もしくはその一部)を極端に小さなサイズに縮小します。例えば、(x2 - x1, y2 - y1)サイズの領域を、(10, 10)などの小さなサイズにリサイズします。
再拡大: 縮小した画像を元のサイズにリサイズします。この際、ピクセルは均一な色で埋められるため、ブロック状の「モザイク」がかかった状態になります。
出力動画の保存:
処理後の動画を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平面への変換にチャレンジします!