[Python] 映像データをavi形式で保存する方法

Pythonで映像データをAVI形式で保存するには、一般的にOpenCVライブラリを使用します。

OpenCVのVideoWriterクラスを使い、映像データをフレームごとに書き込むことでAVIファイルを作成できます。

VideoWriterの初期化には、保存するファイル名、コーデック(例: cv2.VideoWriter_fourcc(*'XVID'))、フレームレート、フレームサイズなどを指定します。

フレームは通常、cv2.imshow()で表示しながら、write()メソッドで保存します。

この記事でわかること
  • AVI形式で映像データを保存する手順
  • コーデックの選択肢と特徴
  • 映像データの前処理方法
  • リアルタイム映像の保存方法
  • 映像データの編集技術

目次から探す

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

ファイルの保存とリリース

映像の保存が完了したら、VideoWriterVideoCaptureを解放する必要があります。

これにより、リソースが適切に解放されます。

# 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
DIVXXVIDと似た特性を持ち、互換性が高い映画の配信
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()

スクリーンキャプチャを保存する

スクリーンキャプチャを保存するには、pyautoguimssライブラリを使用することが一般的です。

以下のコードは、スクリーン全体をキャプチャし、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()

これらの編集手法を使用することで、映像データをより効果的に活用し、目的に応じた映像を作成することができます。

よくある質問

コーデックが正しく動作しない場合は?

コーデックが正しく動作しない場合、以下の点を確認してください。

  • コーデックのインストール: 使用しているコーデックが正しくインストールされているか確認します。

特に、XVIDMJPGなどのコーデックは、別途インストールが必要な場合があります。

  • 互換性の確認: 使用しているメディアプレーヤーが選択したコーデックに対応しているか確認します。

異なるプレーヤーで再生を試みることも有効です。

  • 設定の見直し: cv2.VideoWriterの設定(コーデック、フレームサイズ、フレームレートなど)が正しいか再確認します。

特に、フレームサイズがコーデックの要求するサイズと一致しているか確認してください。

フレームレートが不安定になる原因は?

フレームレートが不安定になる原因はいくつかあります。

  • ハードウェアの性能: 使用しているPCやカメラの性能が不足している場合、フレームの取得や処理が遅れ、フレームレートが不安定になることがあります。
  • 処理負荷: 映像処理の負荷が高い場合(例えば、フィルタリングやエフェクトの適用など)、フレームレートが低下することがあります。

処理を軽減するために、前処理を見直すことが有効です。

  • カメラの設定: Webカメラや外部デバイスの設定が適切でない場合、フレームレートが不安定になることがあります。

カメラの設定を確認し、適切な解像度やフレームレートに設定してください。

保存したAVIファイルが再生できない場合の対処法は?

保存したAVIファイルが再生できない場合、以下の対処法を試みてください。

  • コーデックの確認: AVIファイルを再生するために必要なコーデックがインストールされているか確認します。

特に、XVIDMJPGなどのコーデックが必要な場合があります。

  • ファイルの破損: 保存中にエラーが発生した場合、ファイルが破損している可能性があります。

再度映像を保存し直してみてください。

  • 再生ソフトの変更: 使用しているメディアプレーヤーがAVIファイルに対応しているか確認し、異なるプレーヤー(VLCメディアプレーヤーなど)で再生を試みることも有効です。
  • ファイル形式の確認: 保存時に指定したファイル形式が正しいか確認します。

AVI形式で保存されているか、拡張子が正しいかを確認してください。

まとめ

この記事では、Pythonを使用して映像データをAVI形式で保存する方法や、映像データの前処理、リアルタイム映像の保存、映像の編集手法について詳しく解説しました。

これにより、映像処理の基本的な流れや、さまざまな応用例を理解することができるでしょう。

映像データの保存や編集に興味がある方は、ぜひ実際にコードを試してみて、さまざまな映像処理の技術を体験してみてください。

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