PythonでYouTube動画の変化のあるフレームだけを抜き出してキャプチャする方法

この記事ではYouTube動画における「変化のあるフレーム」、つまりシーンが大きく変わる瞬間や重要なポイントをOpenCVとPytubeを使い、自動で見つけ出してキャプチャする方法について解説します。

目次

PythonでYouTube動画の変化のあるフレームだけを抜き出してキャプチャする方法

Step1: 必要なライブラリをインポート

from pytube import YouTube
import cv2
import os
import numpy as np

YouTube動画をダウンロードするためのpytube、画像処理のためのcv2(OpenCV)、OS依存の機能にアクセスするためのos、数値計算のためのnumpyをインポートします。

Step2: Youtube動画をダウンロード

yt = YouTube('動画のURL')
ys = yt.streams.get_highest_resolution()
ys.download(output_path='.', filename='my_custom_name.mp4')

YouTubeのURLから動画をロードし、最高解像度のストリームを選びます。

ダウンロードして、適当な名前(上記コード内ではmy_custom_name.mp4としています)で保存します。

Step3: フレーム保存用のフォルダを作成

if not os.path.exists('captured_frames'):
    os.mkdir('captured_frames')

captured_framesという名前のディレクトリがなければ作成します。このディレクトリには後でキャプチャされたフレームが保存されます。

Step4: 動画ファイルをオープン

video = cv2.VideoCapture("my_custom_name.mp4")

OpenCVを用いて先ほどダウンロードした動画ファイルを開きます。

Step5: 初期フレームを取得

# 動画から最初のフレームを読み込む
ret, first_frame = video.read()
if not ret:
    print("Could not read the first frame")
    exit()

# 最初のフレームをグレースケールに変換
prev_gray = cv2.cvtColor(first_frame, cv2.COLOR_BGR2GRAY)

動画の最初のフレームを読み取り、グレースケールに変換します。

Step6: フレームの変化を検出

# 変化したフレームを保存するためのリスト
captured_frames = []

# 動画の各フレームを処理
while True:
    # フレームを読み込む
    ret, frame = video.read()
    if not ret:
        break

    # フレームをグレースケールに変換
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 前のフレームと現在のフレームの差分を計算
    diff = cv2.absdiff(gray, prev_gray)

    # 差分の非ゼロピクセルの数を計算
    non_zero_count = np.count_nonzero(diff)

    # フレーム内の全ピクセル数を取得
    total_pixels = diff.size

    # ピクセルの変化割合を計算
    change_ratio = non_zero_count / total_pixels

    # 閾値を超えた場合、フレームをリストに追加
    if change_ratio > 0.3:
        captured_frames.append(frame)

    # 現在のフレームを次のイテレーションの「前のフレーム」として保存
    prev_gray = gray

動画の最初のフレームを読み取り、グレースケールに変換します。
動画をフレームごとに読み取り、その都度前のフレームと比較して変化を検出します。
変化の割合が一定以上(ここでは適当に30%以上にしているので、0.3としています)なら、そのフレームをcaptured_framesという名前のリストに追加します。

Step7: キャプチャしたフレームを保存

for i, frame in enumerate(captured_frames):
    cv2.imwrite(os.path.join('captured_frames', f'frame_{i}.png'), frame)

動画の最初のフレームを読み取り、グレースケールに変換します。

Step8: リソースの解放

video.release()

一応リソースを解放しておきます。

以上がコードの主要なステップとその解説です。各ステップは特定のタスクに焦点を当てており、全体としてはYouTube動画から特定の「変化のある」フレームを極力効率的に抽出することができます。
実際には、自分の好みに応じて変化の割合の閾値を微調整する必要があります。

記事をシェアして話のネタにする

コメント

コメントする

目次