Face01 1.1.3 の numpy.ndarray 出力から matplotlib で動画再生

はじめに

Face01 1.1.3 を呼び出すサンプルプログラム。今回は Face01 から出力される numpy.ndarray から matplotlib を用いて動画ウィンドウを作成してみます。

この様に出力から簡単に動画ウィンドウが生成される様子をご覧ください。

サンプルプログラム

# coding utf-8

print('Start test_script')


import face01_113 as f
import cv2
import numpy as np
import matplotlib.pyplot as plt


kaoninshoDir, pictures_of_people_i_knowDir = f.home()


known_face_encodings, known_face_names = f.load_priset_image(
	kaoninshoDir,
	pictures_of_people_i_knowDir, 
	jitters=1, 
	upsampling=0, 
	mode='hog', 
	model='large'
)


xs = f.face_attestation( 
	kaoninshoDir, 
	known_face_encodings, 
	known_face_names, 
	tolerance=0.45, 
	jitters=0,
	upsampling=0,
	mode='hog', 
	model='large',
	frame_skip=10,
	movie='test.mp4',
	rectangle='true',
	show_video='true'	# 通常のウィンドウも同時に出す
)


for x in xs:
	(name, pict, date, img, location) = (x['name'], x['pict'], x['date'], x['img'], x['location'])
	# ~ print(type(img)) # <class 'numpy.ndarray'>

	# 動画出力は以下の 4 行のみ
	plt.cla()
	img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
	plt.imshow(img)
	plt.pause(0.01)


'''
変数について
jitters			ゆらぎ値。ランダムにスケールアップや色の修正をして平均値を返す。デフォルト値 0
upsampling		サンプリング指定値。0 の時 80x80 ピクセルで顔探索をする。1 では 40x40 ピクセル。
mode			CNN, HOG 両形式を指定する。
model			small -> 5-points method, large -> 68-points method
tolerance		閾値。
frame_skip		フレームドロップの割合。入力が 30fps の場合 frame_skip=2 では 15fps となる
movie			動画入力元を test.mp4 と USB カメラの 2 種類から選ぶ
rectangle		顔周囲に枠を描画するか否か。true:描画する。false:描画しない
'''

出力結果

左が matplotlab で出力したウィンドウ、右が通常の動画出力ウィンドウ
左が matplotlab で出力したウィンドウ、右が通常の動画出力ウィンドウ
matplotlab を用いて出力した結果

今までのサンプルプログラムに付け足したのは以下です。

import matplotlib.pyplot as plt
plt.cla()
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.pause(0.01)

face01 1.1.3 呼び出し時の引数指定

  • upsampling: 0
    80×80 ピクセルで顔探索
  • mode: ‘hog’
    HOG 形式で顔認識
  • model: ‘large’
    68 ポイントメソッド
  • frame_skip ( 手動でのフレームドロップ ) : 10
    元が 30fps なので 3fps に変更
  • rectangle: ‘true’
    顔周りの枠を表示
  • show_video: ‘true’
    動画の出力

まとめ

出力動画は Face01 呼び出し時の引数指定で表示させることが出来ますが、何らかの理由で別の形で動画表示をさせたい時、Face01 は numpy.ndarray 形式で動画を出力しているのでこれを利用することが出来ます。

今回は機械学習でよく使われる matplotlab を用いて動画出力を行いました。
matplotlab は出力が続くと処理動作が重くなっていくので
plt.cla()
を使って毎回表示を初期化しています。
動画は 1 枚ずつのフレームに分割されて出力されますので
plt.imshow(img)
として numpy.ndarray として受け取り
plt.pause(0.01)
として 0.01 秒に一度表示するようにしています。
ちなみに BGR と RGB を変換するために
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
を行っています。

たったこれだけで Face01 が出力する numpy.ndarray データを動画として表現することが出来ます。今回は簡単な紹介でしたので matplotlab を使いましたが、他の GUI として映像出力したいときにも同じように行うことが出来ます。
もちろん、Face01 を呼び出す時に
show_video=’true’
としていただければ openCV の GUI 表示を行うことが出来ます。今回はサンプルということで両方出力させています。

いかがだったでしょうか。
今後の参考にしていただければ幸いです。

なお、Face01 の呼び出し方については
Face01 1.1.2 の呼び出し方について解説します
にて説明させていただいておりますので合わせてご覧ください。

最後までお読み頂きましてありがとうございました。

Follow me!