はじめに
趣味が高じて動画撮影や編集のお仕事が増えくる中、30万円近く出して4Kカメラを購入して色々と撮影をする日々が続いている今日この頃。
撮影した動画が増えすぎて困っていたことから、タイトルにある通り動画を一つ一つ見なくてもサムネイルで内容を把握できる画像が欲しくなり、そんな画像を生成するスクリプトを作ってみたのでメモしておきます。
実行環境
- Python 3.x
- OpenCV
事前準備
以下のようなフォルダ構成にします。
┬ make_img.py
├ mp4
│ ├ 動画1.mp4
│ └ 動画2.mp4
└ img
mp4というフォルダの中に動画データを入れ、imgという空のフォルダを作成します。
スクリプトを作成
make_img.py
from glob import glob
import cv2
import os
import random
def make_thumb(filename):
# 対象ファイルの取得
cap = cv2.VideoCapture(filename)
# 総フレーム数の取得
frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# サムネイルの行列数
row = 4
col = 4
num = row * col
cnt = 0
for r in range(row):
for c in range(col):
# フレーム番号の取得
if cnt == 0:
j = int(0.5 * frames / num)
else:
j = int(frames / num) * (cnt)
# フレームの移動とキャプチャ
cap.set(cv2.CAP_PROP_POS_FRAMES, j)
ret, frame = cap.read()
# 画像リサイズ
h = int(frame.shape[1] / col)
w = int(frame.shape[0] / col)
frame = cv2.resize(frame, (h, w))
# 取得したフレームを横に結合
if c == 0:
im = frame
else:
im = cv2.hconcat([im, frame])
cnt += 1
# 横に結合した画像を縦に結合
if r == 0:
img = im
else:
img = cv2.vconcat([img, im])
cap.release()
return img
def main(bgn=0):
# ファイル一覧の取得
files = glob("./mp4/*.mp4")
files.sort()
print("ファイル数 :", len(files))
i = bgn
for filename in files[bgn:]:
print("\r{:05} {}".format(i, filename), end="")
img = make_thumb(filename)
# 画像の保存
f = "./img/" + filename.split("/")[-1].replace("mp4", "jpg")
cv2.imwrite(f, img)
i += 1
print()
if __name__ == "__main__":
main()
スクリプトを実行
以下のコマンドで実行します。
$ python make_img.py