RのWeb制作

Webサービス制作のための技術情報を。

Python

Jupyter Notebook「7ブロック」でかんたん複数動画のフレームの切り出し(Movie To Image)

投稿日:2019年10月6日 更新日:

はじめに

機械学習のために、動画から画像のデータセットを取り出す必要がありました。
動画 → 画像の変換には多くのフリーソフトはありますが、
今回使おうとした「MOV」ファイルが読み込めるまともなフリーソフトがありませんでした。
※更新停止していたり、ウイルスだと判定されたり散々でした…。

というわけで、Pythonで書いたほうが早いなとなりました。

下記にコードを載せています。
よくわからない人はダウンロードにあるzipファイル(テスト動画付き)を使ってください。

Windows、Macどちらでも使用可能です。

ダウンロード

MovieToImage.zip

コード

使用するモジュールを読み込みます。

import os
import cv2
import glob
from tqdm import tqdm

※インストールできていなければインストールしてください。

基礎設定を行います。
デフォルトでは、Jupyterファイルのあるフォルダの中にimageフォルダを作り、その中に保存します。

file_name = 'IMG_0001.MOV' # 読み込みファイル
fps = 30 # fps(1秒に1枚切り取る)
dir_name = 'image' # 保存dir
image_name = '_img%s.jpg' # 出力ファイル名

保存用関数を設定します。
1フレーム単位で保存するとほぼ動きがない画像になるので、1秒単位で切り分けます。

def video_to_images(video_file=file_name, root_dir='', save_dir=dir_name, image_file=image_name, fps=fps):
    # saveディレクトリを作成
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    
    # 各ムービーのディレクトリを作成
    image_dir = save_dir + '/' + video_file + '/'
    if not os.path.exists(image_dir):
        os.makedirs(image_dir)
        
    # 未設定の場合fpsを設定
    fps = 60 if fps is None else fps
    
    # ビデオファイル名を設定
    read_file = root_dir + video_file
    
    # Videoをフレーム単位で切り取る
    i = 0
    cap = cv2.VideoCapture(read_file)
    while(cap.isOpened()):
        flag, frame = cap.read()
        # 読み込めなかったら終了
        if flag == False:
            break
        # 1枚進める
        i += 1
        if i % fps != 0: # 1秒1枚を出力
            continue
        fname = image_dir + video_file + image_file % str(int(i/fps)).zfill(6)
        cv2.imwrite(fname, frame)
        print('No.%s Save [%s]' % (i, fname))

    cap.release() # capリリース

テストとして1動画ファイルを切り取ってみます。
エラーでなければ、imageフォルダの中に動画ファイル名ごとにフォルダが作成されています。
1枚ずつ切り出すことができました。

# 1画像ファイルを加工
video_to_images()

複数動画の加工を行います。
複数動画を入れるフォルダと拡張子名を設定します。

# 基礎設定
dir_mov = 'mov' # ムービー用dir
file_ex = '.mov' # ムービー拡張子名

globでファイル検索をかけ、filesに格納します。

files = glob.glob(dir_mov + "/*" + file_ex)

実行します。
簡単に処理が終わりました。

# Cut開始
for path in tqdm(files):
    print("#-----------------------------------------------------------#")
    print("# Start MovieToImage... file:%s" % path)
    print("#-----------------------------------------------------------#")
    file_name_one = path.split("\\")[-1]
    video_to_images(video_file=file_name_one, root_dir=dir_mov)

おわりに

Yahoo知恵袋か何かで、「動画ソフトでプリントスクリーン→ペイントすると良い」と当たり前のように書かれていて驚きました。
それちょっと辛くない?時間かかりすぎでしょ・・・というわけで今回作成しました。
何かあればメッセージを残してくださいませ。

-Python

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

[Python] tensorflowが「ImportError: DLL load failed」で困った件について

ImportError: DLL load failed: The specified module could not be found おおん・・・? 今回Tensorflowの新バージョン2.0 …

手書き数字診断士(機械学習)を作り始めました

Python(Flask)+機械学習の勉強がてら、「手書き数字診断士」を作っています。 元ネタは2chの中小企業診断士です。 「う~ん、これは中小企業!w」 やること 1・index.html  1. …

pythonでシグモイド関数と階段関数の表示

ディープラーニング目指して初心者は今日も行く。 初見じゃ何もわからない初心者です。 シグモイド関数?階段関数??なにこれ。 シグモイド関数! 階段関数! 目で見たらわかりますね! コード シグモイド関 …

[Python:Predict Gollira]2枚の画像でどちらがゴリラっぽいかを人間が予想する。

「あーこの人ゴリラっぽい。」と思うことはありませんか? ゴリラっぽさってどこから来るんだろうかと悩んでいました。 前回、[Python] ディープラーニングのモデル「VGG16」を使って画像認識をし、 …

[Python]グリッドサーチを軽量化し、チューニングしたパラメータも反映する機構を作る

パラメータチューニング方法であるグリッドサーチ、 確かに自動で実行してくれて、すごく便利なのですが問題点があります。 めっちゃ時間がかかる もし、下記のパラメータ設定のモノを全てグリッドサーチしようと …