概要
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フォルダ配下に格納している。
- コメントを投稿するにはログインしてください