<経緯>
機械学習の教師データを作成するためにアノテーションを行う必要ができました。
そのために静止画が大量に必要になり、動画から静止画を切り出すことにしました。
はじめは動画から静止画を抽出するツールを使用して手作業で行っていましたが、
その作業が面倒であったので、自動化することにしました。
<手順>
opeCVのインストール
動画の読み込み
単位フレーム毎に静止画を切り出す
静止画サイズを再調整する
opeCVのインストール
今回はwindows+anacondaで行いましたので、anacondaプロンプトで
C:Users\user\conda install -c conda-forge opencv
コマンドでインストールできました。
基本的には全自動でできますが、時間は2時間程度かかりました。
実際に動かすために少しだけPythonでの記述が必要です。
<コード>
ラプラシアンフィルタとは二次微分を利用して画像輪郭を抽出する空間フィルタのことです。
laplacian.varはラプラス分布の分散(ばらつき)を見ています。
if ret and laplacian.var() >= laplacian_thr:
laplacian_thrはボケ画像と判断するためのスレッショルド
この値は自分が見てボケていると認識した画像のパラメータ取得して利用することにして、
今回はlaplaciaan.var()の値が800以下のものをボケ画像として判定することにしました。
"""
@author: S.Nakamura 2020/10/18
動画を読み込んで画像(jpg)に分割するプログラム
input_movie:読み込む動画ファイル名
cpf:何フレームごとに保存するか
image_dir:画像の出力先ディレクトリ(無ければ作成する)
・動画の読み込み
・何フレーム毎に読み込むか
・画像の出力先のディレクトリの指定
・ピンぼけ画像を外す
・サイズの変更
・名前を決めて出力する
"""
import cv2
import numpy as np
import os
i=0
count = 0
cpf = 10 #何フレーム毎に切り出すか
#画像のサイズ
image_width = リサイズする画像の幅
image_heigh = リサイズする画像の高さ
#ボケ画像判定のためのlaplacian.var
laplacian_thr = 800 #ボケ画像判定をするときのスレッショルド
#動画の読み込み
cap = cv2.VideoCapture('読み込む動画ファイルを指定')
while(cap.isOpened()):
ret, frame = cap.read() #動画を読み込む
#assert frame, "オープンに失敗" #デバッグ用
if ret == False:
print('Finished') #動画の切り出しが終了した時
break
if count%cpf == 0: #何フレームに1回切り出すか
#サイズを小さくする
resize_frame = cv2.resize(frame,(image_width,image_heigh))
#画像がぶれていないか確認する
laplacian = cv2.Laplacian(resize_frame, cv2.CV_64F)
if ret and laplacian.var() >= laplacian_thr: # ピンぼけ判定がしきい値以上のもののみ出力
#第1引数画像のファイル名、第2引数保存したい画像
write = cv2.imwrite('保存する画像の名前と拡張子') # 切り出した画像を表示する
assert write, "保存に失敗"
print('Save', 保存する画像の名前と拡張子) #確認用表示
i += 1
count = count + 1
cap.release()
細かい検証はしていませんが、画像を切り出してリサイズするという目的は達成できました。
これだけ簡単な記述で動画から静止画を切り出すことができて感動です。
<参考情報>
Blur detection with OpenCV https://www.pyimagesearch.com/2015/09/07/blur-detection-with-opencv/
note.nkmk.me https://note.nkmk.me/python-opencv-video-to-still-image/
動画(mp4)から画像(jpg)を切り出すプログラム https://www.souichi.club/deep-learning/spliter/