LoginSignup
3
3

More than 3 years have passed since last update.

動画編集の仕事が増えてきたことから、撮りためた動画の内容を簡単に把握したくて、いくつかのシーンをピックアップした画像を簡単に生成できないか考えてみた

Last updated at Posted at 2020-12-06

はじめに

趣味が高じて動画撮影や編集のお仕事が増えくる中、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

実行すると以下のような画像がimgフォルダに保存されます。
20200212_鹿島町PR動画_中画質.jpg
できた!

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3