【OpenCV】連続静止画から動画を作成【Python】

OpenCVを使って、連続静止画から簡単に動画を生成するコードを作成します

使用するデータについて

今回は、静止画のデータとして、Visual Tracker Benchmarkを使います。
画像認識(コンピュータビジョン)の研究で、その性能を示すためによく使われる、世界中で有名なデータセットです。

画像は、名前が4桁の連続番号で与えられます。今回は、この静止画を番号順に読み取って1つの動画にしたいと思います。

動画を生成するコード

環境

下記の環境で開発しました。

OS: Windows10
OpenCV: 4.5.2
python: 3.7.7

コード

import os
import cv2

# name of sample file
file_name = 'DragonBaby'

# get number of image files
DIR = './' + file_name + '/img'
num_total_file = sum(os.path.isfile(os.path.join(DIR, name)) for name in os.listdir(DIR))


# read image and get height and width
img = cv2.imread(DIR + '/0001.jpg')
h, w, ch = img.shape

# set codec and filename
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('./'+ file_name +'/' + file_name + '.avi', fourcc, 20.0, (w,h))
# fourcc = cv2.VideoWriter_fourcc(*'MP4V')
# out = cv2.VideoWriter('./'+ file_name +'/' + file_name + '.mp4', fourcc, 20.0, (w,h))

for i in range(1, num_total_file + 1):
    # read image like 0001.jpg, 0002.jpg, ...
    img = cv2.imread(DIR + '/%04d.jpg' % i)

    # if can't read image, escape
    if img is None:
        print("cannot read images!")
        break

    # make video
    out.write(img)

out.release()
cv2.destroyAllWindows()

解説

順にプログラムの中身を説明していきます。

①画像データの総数を数える。

# name of sample file
file_name = 'DragonBaby'

# get number of image files
DIR = './' + file_name + '/img'
num_total_file = sum(os.path.isfile(os.path.join(DIR, name)) for name in os.listdir(DIR))

静止画のデータのあるフォルダを指定し、画像データが全部でいくつあるのかを数えています。
今回はDragonBabyというサンプルを使います。


②画像の大きさを取得する。

# read image and get height and width
img = cv2.imread(DIR + '/0001.jpg')
h, w, ch = img.shape

最初の画像を読み込んで、画像の大きさを取得します。
動画にする際に読み込んだ元画像と縦横比を同じにするためにこの処理をしています。


③作成したい動画の設定を決める。

# set codec and filename
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('./'+ file_name +'/' + file_name + '.avi', fourcc, 20.0, (w,h))
# fourcc = cv2.VideoWriter_fourcc(*'MP4V')
# out = cv2.VideoWriter('./'+ file_name +'/' + file_name + '.mp4', fourcc, 20.0, (w,h))

動画を作成するための設定をしているのがこの部分です。

fourcc = cv2.VideoWriter_fourcc(*'XVID')

の部分で、動画のコーデックを指定しています。
拡張子 .avi なら[code]*'XVID'[/code]、.mp4なら[code]*'MP4V'[/code]のようにそれぞれ決まっています。
その他のコーデックの種類については、OpenCVの動画コーデック - Qiitaに詳しくまとめてくださっているので、こちらをご覧ください。

続いて、

out = cv2.VideoWriter('./'+ file_name +'/' + file_name + '.avi', fourcc, 20.0, (w,h))

の部分が設定の本題です。引数は、それぞれ 動画を保存するパスとファイル名、コーデック、FPS、縦横の大きさ です。


④画像を順番に読み込む。

for i in range(1, num_total_file + 1):
    # read image like 0001.jpg, 0002.jpg, ...
    img = cv2.imread(DIR + '/%04d.jpg' % i)

    # if can't read image, escape
    if img is None:
        print("cannot read images!")
        break
for i in range(1, num_total_file + 1):

for文で順に読み込んでいきます。rangeは終了条件の数字を含まないため、1加えてあげることですべての画像が読み込まれます。

    # read image like 0001.jpg, 0002.jpg, ...
    img = cv2.imread(DIR + '/%04d.jpg' % i)

1つずつ画像を読み込みます。

    # if can't read image, escape
    if img is None:
        print("cannot read images!")
        break

(ないと思いますが)万が一画像が読み込めなかったり、存在しなかった場合にはメッセージを残して終了します。

⑤動画として保存する。

    # make video
    out.write(img)

以上となります!

もし間違い等ございましたらコメントでお教えいただけますと幸いです。