[Python] opencvで動画の一部を切り出す方法
PythonでOpenCVを使用して動画の一部を切り出すには、まずcv2.VideoCapture
で動画を読み込み、setメソッド
を使って開始フレームを指定します。
次に、readメソッド
でフレームを順次取得し、指定した終了フレームまで繰り返し処理を行います。
取得したフレームはcv2.VideoWriter
を使って新しい動画ファイルに保存できます。
フレーム番号はfps
(フレーム毎秒)を使って時間に変換できます。
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 # 切り出し終了フレーム
フレーム番号から時間を計算する方法
フレーム番号から時間を計算するには、フレームレートを使用します。
以下の式を使って、フレーム番号から時間(秒)を計算できます。
以下のサンプルコードでは、フレーム番号から時間を計算する方法を示します。
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を使用して動画の一部を切り出す方法や、その後の加工手法について詳しく解説しました。
動画の読み込みからフレームの取得、切り出し、さらにはフィルタの適用や解像度の変更、テキストや図形の追加、逆再生まで、幅広い技術を紹介しました。
これらの技術を活用することで、動画編集のスキルを向上させ、より魅力的なコンテンツを作成することが可能です。
ぜひ、実際に手を動かして試してみて、動画編集の楽しさを体験してみてください。