mp4の動画からフレームの画像たちを生成する

概要

mp4などの動画ファイルから、数秒など一定時間おきのフレームのコマの画像を生成して保存する

今回はpython, OpenCVを使う

 

前提条件

  • macOS Ventura 13.3.1 (a)
  • Python 3.10 (pyenv)
  • Homebrew
  • OpenCV
  • (もしかしたら)ffmpeg

 

作業 - OpenCVの準備

Homebrew を使ってOpenCVが使えるようにする

ターミナルで以下を実行

$ brew install opencv

Homebrew Formulae | opencv
https://formulae.brew.sh/formula/opencv

念の為、python側で使えるか見ておく

$ python -m venv venv
$ . venv/bin/activate
(venv) $ pip install opencv-python
(venv) $ python
> import cv2
> exit()

venvで仮想環境をつくり、有効化(activate)

(venv) が有効の中で、pip installし、
pythonのインタプリタ内でOpenCV (cv2) がエラーなくインポートできるかチェックする。

 

作業 - movie2img.py

フォルダ構成は次の感じにした

.
├ venv
├ movie
│ └ xxx.mp4
├ img
│ ├ frame-001.jpg
│ └ frame-002.jpg
└ movie2img.py

 

コード全体像

import cv2

# Load movie
moviePath = 'movie/xxx.mp4'
movie = cv2.VideoCapture(moviePath)

# Check movie properties
frameCount = movie.get(cv2.CAP_PROP_FRAME_COUNT)
fps = movie.get(cv2.CAP_PROP_FPS)
capPeriodSec = 3
capPeriodFrm = int(capPeriodSec * fps)
capRange = int(frameCount / capPeriodFrm)

# Save frame images
imgPath = 'img'
for f in range(capRange):
    movie.set(cv2.CAP_PROP_POS_FRAMES, f * capPeriodFrm)
    ret, frame = movie.read()

    # Image process
    img = cv2.resize(frame, (960, 540))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    cv2.imwrite(f'{imgPath}/frame-{f:05}.jpg', img)
    print(f'Frame: {f}, {type(frame)}')

 

cv2.VideoCapture() により動画ファイルが読み込める。

読み込んだ movie変数に対して、.get() や .set()、 .read() で処理をしていく。

.get()
画像のFPSや総フレーム数などが読み取れる
capPeriodSec で指定する秒数間隔で画像を取得するように計算している

.set()
今回は動画の再生位置を指定するのに使った

.read()
現在位置の情報を返してくれる。
frame の中身には numpy.ndarray型のデータが入っている

ここらへんの関数は、次のページが大変参考になった。

Python, OpenCVで動画を読み込み(ファイル・カメラ映像)
https://note.nkmk.me/python-opencv-videocapture-file-camera/

 

今回は、取得したデータを白黒化&リサイズした上で保存している。

cv2.imwrite() を使い、imgフォルダ配下に格納している。

 

タグ