[Python] 映像データをavi形式で保存する方法
Pythonで映像データをAVI形式で保存するには、一般的にOpenCVライブラリを使用します。
OpenCVのVideoWriterクラス
を使い、映像データをフレームごとに書き込むことでAVIファイルを作成できます。
VideoWriter
の初期化には、保存するファイル名、コーデック(例: cv2.VideoWriter_fourcc(*'XVID')
)、フレームレート、フレームサイズなどを指定します。
フレームは通常、cv2.imshow()
で表示しながら、write()メソッド
で保存します。
AVI形式で映像データを保存する手順
VideoWriterの初期化
映像データをAVI形式で保存するためには、まずcv2.VideoWriter
を初期化する必要があります。
以下のコードでは、出力ファイル名、コーデック、フレームレート、フレームサイズを指定しています。
import cv2
# 出力ファイル名
output_file = 'output.avi'
# コーデックの指定(XVIDを使用)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# フレームレート
fps = 20.0
# フレームサイズ(幅, 高さ)
frame_size = (640, 480)
# VideoWriterの初期化
video_writer = cv2.VideoWriter(output_file, fourcc, fps, frame_size)
フレームの取得と表示
次に、映像データを取得します。
ここでは、Webカメラからの映像を取得し、表示する方法を示します。
cv2.VideoCapture
を使用してカメラを開き、フレームを取得します。
# Webカメラを開く
cap = cv2.VideoCapture(0)
while True:
# フレームを取得
ret, frame = cap.read()
if not ret:
break
# フレームを表示
cv2.imshow('Webcam', frame)
# 'q'キーが押されたらループを終了
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# カメラを解放
cap.release()
cv2.destroyAllWindows()
フレームの書き込み
取得したフレームをAVIファイルに書き込むには、VideoWriter.write()メソッド
を使用します。
以下のコードでは、取得したフレームをAVIファイルに保存しています。
while True:
ret, frame = cap.read()
if not ret:
break
# フレームをAVIファイルに書き込む
video_writer.write(frame)
# フレームを表示
cv2.imshow('Webcam', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
ファイルの保存とリリース
映像の保存が完了したら、VideoWriter
とVideoCapture
を解放する必要があります。
これにより、リソースが適切に解放されます。
# VideoWriterを解放
video_writer.release()
# カメラを解放
cap.release()
# ウィンドウを閉じる
cv2.destroyAllWindows()
コード全体の例
以下に、これまでのコードをまとめた全体の例を示します。
これを実行することで、Webカメラからの映像をAVI形式で保存することができます。
import cv2
# 出力ファイル名
output_file = 'output.avi'
# コーデックの指定(XVIDを使用)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# フレームレート
fps = 20.0
# フレームサイズ(幅, 高さ)
frame_size = (640, 480)
# VideoWriterの初期化
video_writer = cv2.VideoWriter(output_file, fourcc, fps, frame_size)
# Webカメラを開く
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# フレームをAVIファイルに書き込む
video_writer.write(frame)
# フレームを表示
cv2.imshow('Webcam', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# VideoWriterを解放
video_writer.release()
# カメラを解放
cap.release()
# ウィンドウを閉じる
cv2.destroyAllWindows()
このコードを実行すると、Webカメラからの映像がoutput.avi
というファイル名で保存されます。
コーデックの選択肢とその違い
映像データをAVI形式で保存する際には、使用するコーデックを選択することが重要です。
コーデックによって映像の圧縮率や画質、再生互換性が異なるため、目的に応じた選択が求められます。
以下に代表的なコーデックの特徴を解説します。
XVIDコーデックの特徴
- 圧縮率: 高い圧縮率を持ち、ファイルサイズを小さく保つことができます。
- 画質: 圧縮後も比較的高画質を維持します。
- 互換性: 多くのメディアプレーヤーで再生可能で、広く使用されています。
- 用途: 一般的な映像保存やストリーミングに適しています。
MJPGコーデックの特徴
- 圧縮方式: 各フレームをJPEG形式で圧縮するため、フレームごとに独立した圧縮が行われます。
- 画質: 高画質を維持しやすいですが、ファイルサイズは大きくなる傾向があります。
- 互換性: 多くのカメラやデバイスでサポートされており、リアルタイム映像に適しています。
- 用途: 監視カメラやWebカメラの映像保存に適しています。
他のコーデックの選択肢
コーデック名 | 特徴 | 用途 |
---|---|---|
H.264 | 高圧縮率で高画質、ストリーミングに最適 | 動画配信、Blu-ray |
DIVX | XVIDと似た特性を持ち、互換性が高い | 映画の配信 |
HEVC | より高い圧縮率を実現、4K映像に適している | 高解像度映像の保存 |
コーデック選択時の注意点
- 目的に応じた選択: 映像の用途(ストリーミング、保存、編集など)に応じて適切なコーデックを選ぶことが重要です。
- 互換性の確認: 再生するデバイスやソフトウェアとの互換性を確認する必要があります。
- 画質とファイルサイズのバランス: 高画質を求める場合はファイルサイズが大きくなることを考慮し、ストレージの容量を確認することが大切です。
- エンコード時間: 一部のコーデックはエンコードに時間がかかるため、リアルタイム性が求められる場合は注意が必要です。
映像データの前処理
映像データをAVI形式で保存する前に、フレームに対して前処理を行うことで、データの品質を向上させたり、特定の目的に適した形式に変換したりすることができます。
以下に、一般的な前処理の手法を解説します。
フレームのリサイズ
フレームのリサイズは、映像の解像度を変更するプロセスです。
これにより、ファイルサイズを小さくしたり、特定のデバイスに合わせた解像度に調整したりできます。
以下のコードは、フレームを640×480ピクセルにリサイズする例です。
# フレームをリサイズ
resized_frame = cv2.resize(frame, (640, 480))
フレームの色変換
色変換は、フレームの色空間を変更するプロセスです。
例えば、BGRからグレースケールに変換することで、処理が軽くなり、特定の画像処理アルゴリズムに適した形式にすることができます。
以下のコードは、フレームをグレースケールに変換する例です。
# フレームをグレースケールに変換
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
フレームのフィルタリング
フィルタリングは、ノイズを除去したり、画像のエッジを強調したりするために使用されます。
例えば、ガウシアンフィルタを使用してノイズを軽減することができます。
以下のコードは、ガウシアンフィルタを適用する例です。
# ガウシアンフィルタを適用
filtered_frame = cv2.GaussianBlur(frame, (5, 5), 0)
フレームの回転や反転
フレームの回転や反転は、映像の視覚的な調整を行うために使用されます。
例えば、90度回転させたり、上下反転させたりすることができます。
以下のコードは、フレームを90度回転させる例です。
# フレームを90度回転
rotated_frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE)
これらの前処理を行うことで、映像データの品質を向上させたり、特定の目的に適した形式に変換したりすることができます。
前処理は、映像処理の重要なステップであり、最終的な結果に大きな影響を与えます。
応用例:リアルタイム映像の保存
リアルタイム映像の保存は、さまざまな用途に応じて行われます。
ここでは、Webカメラ、スクリーンキャプチャ、外部デバイスからの映像を保存する方法について解説します。
Webカメラからの映像を保存する
Webカメラからの映像を保存するには、cv2.VideoCapture
を使用してカメラを開き、フレームを取得して保存します。
以下のコードは、Webカメラからの映像をAVI形式で保存する例です。
import cv2
# 出力ファイル名
output_file = 'webcam_output.avi'
fourcc = cv2.VideoWriter_fourcc(*'XVID')
fps = 20.0
frame_size = (640, 480)
# VideoWriterの初期化
video_writer = cv2.VideoWriter(output_file, fourcc, fps, frame_size)
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# フレームをAVIファイルに書き込む
video_writer.write(frame)
# フレームを表示
cv2.imshow('Webcam', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# リソースの解放
video_writer.release()
cap.release()
cv2.destroyAllWindows()
スクリーンキャプチャを保存する
スクリーンキャプチャを保存するには、pyautogui
やmss
ライブラリを使用することが一般的です。
以下のコードは、スクリーン全体をキャプチャし、AVI形式で保存する例です。
import cv2
import numpy as np
import mss
# 出力ファイル名
output_file = 'screenshot_output.avi'
fourcc = cv2.VideoWriter_fourcc(*'XVID')
fps = 20.0
frame_size = (1920, 1080) # スクリーンサイズに合わせる
# VideoWriterの初期化
video_writer = cv2.VideoWriter(output_file, fourcc, fps, frame_size)
sct = mss.mss()
while True:
# スクリーンキャプチャ
img = sct.grab(sct.monitors[1])
frame = np.array(img)
# BGR形式に変換
frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)
# フレームをAVIファイルに書き込む
video_writer.write(frame)
# フレームを表示
cv2.imshow('Screen Capture', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# リソースの解放
video_writer.release()
cv2.destroyAllWindows()
外部デバイスからの映像を保存する
外部デバイス(例えば、HDMIキャプチャカードなど)からの映像を保存する場合も、cv2.VideoCapture
を使用します。
デバイスのインデックスを指定することで、映像を取得できます。
以下のコードは、外部デバイスからの映像を保存する例です。
import cv2
# 出力ファイル名
output_file = 'external_device_output.avi'
fourcc = cv2.VideoWriter_fourcc(*'XVID')
fps = 20.0
frame_size = (640, 480)
# VideoWriterの初期化
video_writer = cv2.VideoWriter(output_file, fourcc, fps, frame_size)
cap = cv2.VideoCapture(1) # 外部デバイスのインデックスを指定
while True:
ret, frame = cap.read()
if not ret:
break
# フレームをAVIファイルに書き込む
video_writer.write(frame)
# フレームを表示
cv2.imshow('External Device', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# リソースの解放
video_writer.release()
cap.release()
cv2.destroyAllWindows()
これらの方法を使用することで、リアルタイムで映像を保存し、さまざまな用途に活用することができます。
応用例:映像データの編集と保存
映像データの編集は、特定の目的に応じて映像を加工するための重要なプロセスです。
ここでは、映像のトリミング、結合、テキストや図形の追加について解説します。
映像のトリミング
映像のトリミングは、特定の部分だけを切り出して新しい映像を作成するプロセスです。
以下のコードは、指定したフレーム範囲をトリミングして新しいAVIファイルに保存する例です。
import cv2
# 入力ファイル名と出力ファイル名
input_file = 'input_video.avi'
output_file = 'trimmed_video.avi'
cap = cv2.VideoCapture(input_file)
# VideoWriterの初期化
fourcc = cv2.VideoWriter_fourcc(*'XVID')
fps = cap.get(cv2.CAP_PROP_FPS)
frame_size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
video_writer = cv2.VideoWriter(output_file, fourcc, fps, frame_size)
# トリミングするフレーム範囲
start_frame = 100 # 開始フレーム
end_frame = 200 # 終了フレーム
current_frame = 0
while True:
ret, frame = cap.read()
if not ret or current_frame > end_frame:
break
if current_frame >= start_frame:
video_writer.write(frame)
current_frame += 1
# リソースの解放
cap.release()
video_writer.release()
映像の結合
複数の映像を結合して1つの映像にすることも可能です。
以下のコードは、2つのAVIファイルを結合して新しいAVIファイルに保存する例です。
import cv2
# 入力ファイル名
input_file1 = 'video1.avi'
input_file2 = 'video2.avi'
output_file = 'combined_video.avi'
# 最初の映像を開く
cap1 = cv2.VideoCapture(input_file1)
cap2 = cv2.VideoCapture(input_file2)
# VideoWriterの初期化
fourcc = cv2.VideoWriter_fourcc(*'XVID')
fps = cap1.get(cv2.CAP_PROP_FPS)
frame_size = (int(cap1.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap1.get(cv2.CAP_PROP_FRAME_HEIGHT)))
video_writer = cv2.VideoWriter(output_file, fourcc, fps, frame_size)
# 映像1のフレームを結合
while True:
ret, frame = cap1.read()
if not ret:
break
video_writer.write(frame)
# 映像2のフレームを結合
while True:
ret, frame = cap2.read()
if not ret:
break
video_writer.write(frame)
# リソースの解放
cap1.release()
cap2.release()
video_writer.release()
映像にテキストや図形を追加する
映像にテキストや図形を追加することで、視覚的な情報を強化することができます。
以下のコードは、映像にテキストと矩形を追加する例です。
import cv2
# 入力ファイル名と出力ファイル名
input_file = 'input_video.avi'
output_file = 'annotated_video.avi'
cap = cv2.VideoCapture(input_file)
# VideoWriterの初期化
fourcc = cv2.VideoWriter_fourcc(*'XVID')
fps = cap.get(cv2.CAP_PROP_FPS)
frame_size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
video_writer = cv2.VideoWriter(output_file, fourcc, fps, frame_size)
while True:
ret, frame = cap.read()
if not ret:
break
# テキストを追加
cv2.putText(frame, 'Sample Text', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
# 矩形を追加
cv2.rectangle(frame, (100, 100), (400, 300), (0, 255, 0), 3)
# フレームをAVIファイルに書き込む
video_writer.write(frame)
# リソースの解放
cap.release()
video_writer.release()
これらの編集手法を使用することで、映像データをより効果的に活用し、目的に応じた映像を作成することができます。
まとめ
この記事では、Pythonを使用して映像データをAVI形式で保存する方法や、映像データの前処理、リアルタイム映像の保存、映像の編集手法について詳しく解説しました。
これにより、映像処理の基本的な流れや、さまざまな応用例を理解することができるでしょう。
映像データの保存や編集に興味がある方は、ぜひ実際にコードを試してみて、さまざまな映像処理の技術を体験してみてください。