Gemini でプログラミング学習 #3 OpenCV でWebカメラの映像をMPEG4で保存する

現在、Pythonを勉強中です。 また、生成AIも習うより慣れよと出来る限り使って経験値を高めようとしています。 ということで Gemini を教師として Python のプログラミングを学習していく過程をブログに残していきます。

今回は Webカメラの映像を MPEG4ファイルで保存するプログラムを作っていきます。 まずは Windows PC のローカルディスクに保存するプログラムを作りますがゆくゆくはクラウド上、Alibaba Cloud の OSS などに、保管するプログラムも作る予定です。

Gemini に教えてもらう

bigriver.jp
bigriver.jp

OpenCVでWebカメラから読み込んだ10秒間の映像をmpeg4形式で保存するプログラムを教えて

Gemini
Gemini

OpenCV で動画をファイル保存する場合は cv2.VideoWriter を利用することがわかります。 フレームレイトやサイズ、出力ファイル名をパラメータとしたオブジェクトを生成し out.write()で書き出していく感じのようです。

実際に Gemini が提案してくれたコードで動作するか確認していきます。

コード

コーディングは Github for Copilot の拡張機能をインストールした Visual Studio Code で行っています。

コメントを英語で書いたのとファイル名(filename)を変えています。

import cv2
import time

# Settigns for saving video files
filename = "bigriver.mp4"
fps = 30.0
frame_size = (640, 480)

# Create a VideoCapture object
# "mp4v" is MPEG-4 Video Codec
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(filename, fourcc, fps, frame_size)

# Web camera's deviceId
cap = cv2.VideoCapture(0)

# start time
start_time = time.time()

while True:
    # read a frame from the camera
    ret, frame = cap.read()

    # if the frame was not read, exit
    if ret:
        # write the frame to the file
        out.write(frame)

        # 10 seconds have passed
        if time.time() - start_time > 10:
            break

# release the camera
cap.release()
out.release()

print('Saved video file as', filename)

実行するとカレントディレクトリにファイルが生成されます。 生成された動画も問題なく再生できました。

Gemini からのコードの解説も紹介します。 

解説

  1. cv2.VideoWriter オブジェクトを作成します。
    • filename: 保存するファイル名(ここでは “output.mp4″)
    • fourcc: コーデック(ここでは ‘mp4v’ を指定してMPEG-4形式に)
    • fps: フレームレート
    • frame_size: フレームサイズ
  2. cap.read() でウェブカメラからフレームを読み込みます。
  3. out.write(frame) で読み込んだフレームをビデオファイルに書き込みます。
  4. time.time() - start_time >= 10 で10秒経過したかどうかを判定し、終了条件を満たしたらループを抜けて終了します。
  5. cap.release(), out.release() でウェブカメラと VideoWriter オブジェクトを解放します。

注意点

  • 'mp4v' コーデックは、環境によっては利用できない場合があります。その場合は、他のMPEG-4コーデック ('x264', 'avc1' など) を試してみてください。
  • MPEG-4形式で保存するには、環境に適切なエンコーダーがインストールされている必要があります。

フレームサイズ(解像度)を変更してみる

試しに frame_size を(640, 480) から (1280, 720) に変えてみます。

import cv2
import time

# Settigns for saving video files
filename = "bigriver.mp4"
fps = 30.0
frame_size = (1280, 720)

# Create a VideoCapture object
# "mp4v" is MPEG-4 Video Codec
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(filename, fourcc, fps, frame_size)

# Web camera's deviceId
cap = cv2.VideoCapture(0)

# start time
start_time = time.time()

while True:
    # read a frame from the camera
    ret, frame = cap.read()

    # if the frame was not read, exit
    if ret:
        # write the frame to the file
        out.write(frame)

        # 10 seconds have passed
        if time.time() - start_time > 10:
            break

# release the camera
cap.release()
out.release()

print('Saved video file as', filename)

“bigriver.mp4″ファイルサイズは 1KB しかありません。

どうやら何か問題があるようです。 無理だろうと思いつつ動画ファイルを開いてみますが以下の通りのメッセージが表示され Web カメラからの映像の動画ファイル作成に失敗しました。

正攻法に OpenCV の仕様を確認することにします。 frame_size に使える解像度は何かを。

正しい答えが返ってこないかもしれませんが Gemini に聞いてみます。

bigriver.jp
bigriver.jp

frame_size で使用可能なパラメータを教えて

Gemini
Gemini

上記の説明を読むと Frame_size は任意の値を自由に指定できるものではなく、Web カメラが対応する解像度を指定する必要があるとのことでした。 私が指定した 1280 x 720 に私の Web カメラが対応していなかった可能性が出てきました。

また、Gemini からは Web カメラが対応する解像度を確認するサンプルコードまで提示されています。 コードを実行すると 640 x 480 のみが対応する解像度のようでした。 Web カメラ(Logicool C615)のハードウェアスペックとしては 1920 x 1080 に対応しているのですが OpenCV 側から見て 640 x 480 しかサポートしないとなっているのでそういうものなのかもしれません。

以上