[Python] opencvで動画の一部を切り出す方法

PythonでOpenCVを使用して動画の一部を切り出すには、まずcv2.VideoCaptureで動画を読み込み、setメソッドを使って開始フレームを指定します。

次に、readメソッドでフレームを順次取得し、指定した終了フレームまで繰り返し処理を行います。

取得したフレームはcv2.VideoWriterを使って新しい動画ファイルに保存できます。

フレーム番号はfps(フレーム毎秒)を使って時間に変換できます。

この記事でわかること
  • OpenCVを使った動画の基本操作
  • 動画の一部を切り出す手順
  • フィルタやテキストの追加方法
  • 動画の解像度変更の実践
  • 音声を含めた動画処理の方法

目次から探す

OpenCVで動画を扱う基本

OpenCVのインストール方法

OpenCVはPythonで画像処理やコンピュータビジョンを行うためのライブラリです。

以下のコマンドを使用して、OpenCVをインストールできます。

pip install opencv-python

動画ファイルの読み込み

動画ファイルを読み込むには、cv2.VideoCaptureを使用します。

以下のサンプルコードでは、動画ファイルを読み込む方法を示します。

import cv2
# 動画ファイルのパスを指定
video_path = 'sample_video.mp4'
cap = cv2.VideoCapture(video_path)
# 動画が正常に読み込まれたか確認
if not cap.isOpened():
    print("動画ファイルを開けませんでした。")
else:
    print("動画ファイルが正常に読み込まれました。")
動画ファイルが正常に読み込まれました。

フレームの取得方法

動画からフレームを取得するには、cap.read()メソッドを使用します。

このメソッドは、次のフレームを取得し、成功したかどうかを示すフラグを返します。

以下のサンプルコードを参照してください。

import cv2
video_path = 'sample_video.mp4'
cap = cv2.VideoCapture(video_path)
while True:
    ret, frame = cap.read()
    if not ret:
        break  # フレームが取得できなかった場合、ループを終了
    # フレームを表示
    cv2.imshow('Frame', frame)
    # 'q'キーが押されたら終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

フレームレートの確認

動画のフレームレートを確認するには、cap.get(cv2.CAP_PROP_FPS)を使用します。

以下のサンプルコードで確認できます。

import cv2
video_path = 'sample_video.mp4'
cap = cv2.VideoCapture(video_path)
# フレームレートを取得
fps = cap.get(cv2.CAP_PROP_FPS)
print(f"フレームレート: {fps} FPS")
cap.release()
フレームレート: 30.0 FPS

動画の保存方法

動画を保存するには、cv2.VideoWriterを使用します。

以下のサンプルコードでは、動画を保存する方法を示します。

import cv2
video_path = 'sample_video.mp4'
output_path = 'output_video.avi'
cap = cv2.VideoCapture(video_path)
# 動画のフレームレートとサイズを取得
fps = cap.get(cv2.CAP_PROP_FPS)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# VideoWriterオブジェクトを作成
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
while True:
    ret, frame = cap.read()
    if not ret:
        break
    # フレームを保存
    out.write(frame)
cap.release()
out.release()
print("動画が保存されました。")
動画が保存されました。

動画の一部を切り出す手順

動画の開始フレームと終了フレームを指定する

動画の一部を切り出すためには、まず開始フレームと終了フレームを指定する必要があります。

以下のサンプルコードでは、開始フレームと終了フレームを設定する方法を示します。

# 開始フレームと終了フレームを指定
start_frame = 100  # 切り出し開始フレーム
end_frame = 200    # 切り出し終了フレーム

フレーム番号から時間を計算する方法

フレーム番号から時間を計算するには、フレームレートを使用します。

以下の式を使って、フレーム番号から時間(秒)を計算できます。

\[\text{時間} = \frac{\text{フレーム番号}}{\text{フレームレート}}\]

以下のサンプルコードでは、フレーム番号から時間を計算する方法を示します。

import cv2
video_path = 'sample_video.mp4'
cap = cv2.VideoCapture(video_path)
# フレームレートを取得
fps = cap.get(cv2.CAP_PROP_FPS)
# フレーム番号から時間を計算
start_time = start_frame / fps
end_time = end_frame / fps
print(f"開始時間: {start_time}秒, 終了時間: {end_time}秒")
cap.release()
開始時間: 3.333秒, 終了時間: 6.667秒

指定範囲のフレームを取得する

指定した範囲のフレームを取得するには、cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)を使用して、特定のフレームに移動します。

以下のサンプルコードでは、指定範囲のフレームを取得する方法を示します。

import cv2
video_path = 'sample_video.mp4'
cap = cv2.VideoCapture(video_path)
# 開始フレームから終了フレームまでのフレームを取得
for frame_number in range(start_frame, end_frame + 1):
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)
    ret, frame = cap.read()
    if ret:
        # フレームを表示(必要に応じて処理を追加)
        cv2.imshow('Frame', frame)
        cv2.waitKey(30)  # 30ミリ秒待機
cap.release()
cv2.destroyAllWindows()

切り出したフレームを新しい動画として保存する

指定した範囲のフレームを新しい動画として保存するには、cv2.VideoWriterを使用します。

以下のサンプルコードでは、切り出したフレームを新しい動画として保存する方法を示します。

import cv2
video_path = 'sample_video.mp4'
output_path = 'cut_video.avi'
cap = cv2.VideoCapture(video_path)
# フレームレートとサイズを取得
fps = cap.get(cv2.CAP_PROP_FPS)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# VideoWriterオブジェクトを作成
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
# 指定範囲のフレームを取得して保存
for frame_number in range(start_frame, end_frame + 1):
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)
    ret, frame = cap.read()
    if ret:
        out.write(frame)  # フレームを保存
cap.release()
out.release()
print("切り出した動画が保存されました。")
切り出した動画が保存されました。

コード例:動画の一部を切り出す

動画の読み込みとフレームの確認

まず、動画ファイルを読み込み、フレームが正常に取得できるか確認します。

以下のサンプルコードでは、動画を読み込み、フレーム数を表示します。

import cv2
video_path = 'sample_video.mp4'
cap = cv2.VideoCapture(video_path)
# 動画が正常に読み込まれたか確認
if not cap.isOpened():
    print("動画ファイルを開けませんでした。")
else:
    # フレーム数を取得
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    print(f"動画のフレーム数: {total_frames}")
cap.release()
動画のフレーム数: 300

開始フレームと終了フレームの設定

次に、切り出したい範囲の開始フレームと終了フレームを設定します。

以下のサンプルコードでは、開始フレームと終了フレームを指定します。

# 開始フレームと終了フレームを指定
start_frame = 50  # 切り出し開始フレーム
end_frame = 150   # 切り出し終了フレーム

フレームの切り出しと保存

指定した範囲のフレームを切り出し、新しい動画として保存します。

以下のサンプルコードでは、切り出したフレームを新しい動画ファイルに保存します。

import cv2
video_path = 'sample_video.mp4'
output_path = 'cut_video.avi'
cap = cv2.VideoCapture(video_path)
# フレームレートとサイズを取得
fps = cap.get(cv2.CAP_PROP_FPS)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# VideoWriterオブジェクトを作成
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
# 指定範囲のフレームを取得して保存
for frame_number in range(start_frame, end_frame + 1):
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)
    ret, frame = cap.read()
    if ret:
        out.write(frame)  # フレームを保存
cap.release()
out.release()
print("切り出した動画が保存されました。")
切り出した動画が保存されました。

動画の再生時間を指定して切り出す方法

動画の再生時間を指定して切り出す場合、フレームレートを使用してフレーム番号を計算します。

以下のサンプルコードでは、開始時間と終了時間を指定して、対応するフレームを切り出します。

import cv2
video_path = 'sample_video.mp4'
output_path = 'cut_video_by_time.avi'
cap = cv2.VideoCapture(video_path)
# フレームレートを取得
fps = cap.get(cv2.CAP_PROP_FPS)
# 開始時間と終了時間を指定(秒)
start_time = 2.0  # 2秒
end_time = 5.0    # 5秒
# 時間からフレーム番号を計算
start_frame = int(start_time * fps)
end_frame = int(end_time * fps)
# VideoWriterオブジェクトを作成
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (int(cap.get(3)), int(cap.get(4))))
# 指定範囲のフレームを取得して保存
for frame_number in range(start_frame, end_frame + 1):
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)
    ret, frame = cap.read()
    if ret:
        out.write(frame)  # フレームを保存
cap.release()
out.release()
print("指定した時間の動画が保存されました。")
指定した時間の動画が保存されました。

応用例:動画の一部を加工して保存する

切り出した動画にフィルタを適用する

切り出した動画にフィルタを適用することで、映像の印象を変えることができます。

以下のサンプルコードでは、切り出したフレームにガウシアンブラーを適用しています。

import cv2
video_path = 'cut_video.avi'
output_path = 'filtered_video.avi'
cap = cv2.VideoCapture(video_path)
# フレームレートとサイズを取得
fps = cap.get(cv2.CAP_PROP_FPS)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# VideoWriterオブジェクトを作成
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
while True:
    ret, frame = cap.read()
    if not ret:
        break
    # ガウシアンブラーを適用
    filtered_frame = cv2.GaussianBlur(frame, (15, 15), 0)
    out.write(filtered_frame)  # フィルタを適用したフレームを保存
cap.release()
out.release()
print("フィルタを適用した動画が保存されました。")
フィルタを適用した動画が保存されました。

切り出した動画の解像度を変更する

動画の解像度を変更するには、cv2.resizeを使用します。

以下のサンプルコードでは、切り出した動画の解像度を640×480に変更しています。

import cv2
video_path = 'cut_video.avi'
output_path = 'resized_video.avi'
cap = cv2.VideoCapture(video_path)
# フレームレートを取得
fps = cap.get(cv2.CAP_PROP_FPS)
# VideoWriterオブジェクトを作成
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (640, 480))
while True:
    ret, frame = cap.read()
    if not ret:
        break
    # 解像度を変更
    resized_frame = cv2.resize(frame, (640, 480))
    out.write(resized_frame)  # リサイズしたフレームを保存
cap.release()
out.release()
print("解像度を変更した動画が保存されました。")
解像度を変更した動画が保存されました。

切り出した動画にテキストや図形を追加する

動画にテキストや図形を追加することで、情報を視覚的に伝えることができます。

以下のサンプルコードでは、フレームにテキストを追加しています。

import cv2
video_path = 'cut_video.avi'
output_path = 'text_added_video.avi'
cap = cv2.VideoCapture(video_path)
# フレームレートとサイズを取得
fps = cap.get(cv2.CAP_PROP_FPS)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# VideoWriterオブジェクトを作成
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
while True:
    ret, frame = cap.read()
    if not ret:
        break
    # テキストを追加
    cv2.putText(frame, 'Sample Text', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)
    out.write(frame)  # テキストを追加したフレームを保存
cap.release()
out.release()
print("テキストを追加した動画が保存されました。")
テキストを追加した動画が保存されました。

切り出した動画を逆再生する

動画を逆再生するには、フレームを逆順に保存する必要があります。

以下のサンプルコードでは、切り出した動画を逆再生しています。

import cv2
video_path = 'cut_video.avi'
output_path = 'reversed_video.avi'
cap = cv2.VideoCapture(video_path)
# フレームレートとサイズを取得
fps = cap.get(cv2.CAP_PROP_FPS)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# VideoWriterオブジェクトを作成
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
# フレームを全て取得してリストに保存
frames = []
while True:
    ret, frame = cap.read()
    if not ret:
        break
    frames.append(frame)
# リストを逆順にして保存
for frame in reversed(frames):
    out.write(frame)
cap.release()
out.release()
print("逆再生した動画が保存されました。")
逆再生した動画が保存されました。

よくある質問

動画のフレーム数を確認するには?

動画のフレーム数を確認するには、OpenCVのcv2.VideoCaptureを使用して動画を読み込み、cap.get(cv2.CAP_PROP_FRAME_COUNT)メソッドを呼び出します。

以下のように実装できます。

import cv2
video_path = 'sample_video.mp4'
cap = cv2.VideoCapture(video_path)
# フレーム数を取得
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(f"動画のフレーム数: {total_frames}")
cap.release()

このコードを実行すると、指定した動画のフレーム数が表示されます。

動画の一部を切り出す際に音声も含めることはできる?

OpenCVは主に画像処理に特化したライブラリであり、音声の処理には対応していません。

動画の音声を含めて切り出す場合は、moviepyffmpegなどの他のライブラリを使用する必要があります。

これらのライブラリを使うことで、音声と映像を同時に処理することが可能です。

例えば、moviepyを使用する場合は以下のようにします。

from moviepy.video.io.VideoFileClip import VideoFileClip
video_path = 'sample_video.mp4'
output_path = 'cut_video_with_audio.mp4'
with VideoFileClip(video_path) as video:
    cut_video = video.subclip(2, 5)  # 2秒から5秒の部分を切り出し
    cut_video.write_videofile(output_path)

切り出した動画のサイズが大きくなるのはなぜ?

切り出した動画のサイズが大きくなる理由はいくつかあります。

主な要因は以下の通りです。

  • コーデックの選択: 使用するコーデックによって圧縮率が異なります。

例えば、XVIDMJPEGなどのコーデックは、圧縮率が低く、ファイルサイズが大きくなることがあります。

  • ビットレート: 動画のビットレートが高いと、画質は向上しますが、ファイルサイズも大きくなります。
  • 解像度: 高解像度の動画は、低解像度の動画よりもファイルサイズが大きくなります。
  • フレームレート: フレームレートが高いと、1秒間に多くのフレームが保存されるため、ファイルサイズが増加します。

これらの要因を考慮し、適切なコーデックや設定を選ぶことで、ファイルサイズを抑えることができます。

まとめ

この記事では、OpenCVを使用して動画の一部を切り出す方法や、その後の加工手法について詳しく解説しました。

動画の読み込みからフレームの取得、切り出し、さらにはフィルタの適用や解像度の変更、テキストや図形の追加、逆再生まで、幅広い技術を紹介しました。

これらの技術を活用することで、動画編集のスキルを向上させ、より魅力的なコンテンツを作成することが可能です。

ぜひ、実際に手を動かして試してみて、動画編集の楽しさを体験してみてください。

  • URLをコピーしました!
目次から探す