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

はじめに

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

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

サンプルプログラム

# coding utf-8

print('Start test_script')


import face_recognition
import cv2
import numpy as np
import os
import sys
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import time
from datetime import datetime
import io
import shutil
import platform
import re
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=10, 
	upsampling=1, 
	mode='cnn', 
	model='large'
)


xs = f.face_attestation( 
	kaoninshoDir, 
	known_face_encodings, 
	known_face_names, 
	tolerance=0.4, 
	jitters=2,
	upsampling=0,
	mode='cnn', 
	model='large',
	frame_skip=15,
	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:描画しない
'''

出力結果

matplotlibを使ったGUI窓の作成
左が matplotlab で出力したウィンドウ、右が通常の動画出力ウィンドウ

※音が出ます

matplotlab を用いて出力した結果

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

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

Face01 Graphics 1.1.8 呼び出し時の引数指定

  • upsampling: 0
    80×80 ピクセルで顔探索
  • mode: ‘cnn’
    CNN 形式で顔認識
  • model: ‘large’
    68 ポイントメソッド
  • frame_skip ( 手動でのフレームドロップ ) : 15
  • rectangle: ‘true’
    顔周りの枠を表示
  • show_video: ‘true’
    動画の出力

まとめ

出力動画は Face01 Graphics 呼び出し時の引数指定で表示させることが出来ますが、何らかの理由で別の形で動画表示をさせたい時、Face01 Graphics は 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 Graphics が出力する numpy.ndarray データを動画として表現することが出来ます。今回は簡単な紹介でしたので matplotlab を使いましたが、他の GUI として映像出力したいときにも同じように行うことが出来ます。
もちろん、Face01 を呼び出す時に
show_video=’true’
としていただければ openCV の GUI 表示を行うことが出来ます。今回はサンプルということで両方出力させています。

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

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

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

Follow me!