
ゆうき( @BASEBALLY15 )です^^
カスケードファイルで顔を検出できたのですが,保存枚数を自由に決めたいです・・・
分かりました^^
それでは,今回は,検出した顔画像の保存枚数を自由に決める方法をご紹介します.
お願いします・・・

目次
顔を検出して,保存枚数を決めよう!

まず,カスケードファイルを使って,顔を検出します.
そして,『保存枚数=』と表示されるので,『120』と書き込むと120枚の顔画像が保存されるという流れです.
それでは,コードを見ていきましょう⤵
最初に,枚数を指定するためのコードをご紹介します.
その後に,全体の流れをご紹介します.
Today’s Code
今回のToday’s Codeを記述することで,このように表示されます.



まずは,入力画面に『保存枚数=』と表示させます.
#保存枚数を指定する
n = int(input("保存枚数="))
そして,指定した枚数になったら終了させます.
#もし,保存枚数が指定した枚数になったら,
if detect_N >= n:
#終了
break
このコードを見ると,「detect_Nって何?」と疑問に感じたのではないでしょうか?
それでは,全体の流れをご紹介します.
顔画像を保存するまでの流れ
ライブラリ
#映像や画像を扱うためのライブラリ
import cv2
#ファイルやディレクトリを操作するためのライブラリ
import os
#ディレクトリを取り除くためのライブラリ
import shutil
コード
ディレクトリを用意しよう!
まずは,画像を保存するためのディレクトリを用意します.
#------------------------------------------------
#ディレクトリの作成(画像の保存先)
save_dir = "./my_face"
#ディレクトリの初期化
if os.path.exists(save_dir) == True:
#取り除く
shutil.rmtree(save_dir)
#もし,ディレクトリが無いなら,作る
if not os.path.isdir(save_dir):
os.mkdir(save_dir)
#------------------------------------------------
映像サイズの指定と画像枚数の初期化をしよう!
次に,映像のサイズと画像枚数を定義します.
#映像のサイズの指定
width = 500
height = 300
#画像の枚数の初期化
all_N = 0
#検出した枚数の初期化
detect_N = 0
検出器を用意しよう!
#Webカメラから入力を開始
cap = cv2.VideoCapture(0)
#顔の検出器を作成
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
そして,1つ目のToday’s Codeを書きます.
1つ目のToday’s Code
保存する枚数を指定します.
#保存枚数を指定する
n = int(input("保存枚数="))
顔を検出し,指定した枚数の顔画像を保存しよう!(2つ目のToday’s Code含む)
指定した枚数まで常に映像を表示させるので,『while文』を使います.
#カメラから連続して映像を取得
while True:
#カメラの画像を読み込む
ret, frame = cap.read()
#画像のサイズを変更(リサイズ)
frame = cv2.resize(frame, (width, height))
#画像の枚数をカウントしていく
all_N += 1
#グレイスケールに変換
gray_flame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#顔認証を実行(minNeighboreは信頼性のパラメータ)
face_list = face_cascade.detectMultiScale(gray_flame, minNeighbors=20)
#顔を四角で囲む
for (x,y,w,h) in face_list:
red = (0,0,255)
#四角で囲った部分に名前を付けておく
cv2.rectangle(frame, (x,y), (x+w,y+h), red, 1)
#顔のみの画像を保存するために用意しておく
trim_face = frame[y:y+h, x:x+w]
#顔と目を認証した時のみディレクトリに保存していく
if len(face_list) > 0:
#ファイル名
file_name = save_dir + "/"+ "my_face" + str(detect_N) + ".jpg"
#保存する
cv2.imwrite(file_name, trim_face)
#番号を増やしていく
detect_N += 1
#ウィンドウに画像を出力
cv2.imshow("My_Face", frame)
#もし,Enterキーが押されたら終了
#1msec確認
exit_wind = cv2.waitKey(1)
if exit_wind == 13:
break
#------------------------------------------------
###2つ目のToday's Code###
#------------------------------------------------
#もし,保存枚数が指定した枚数になったら,
if detect_N >= n:
#終了
break
#------------------------------------------------
そして,映像画面を閉じて,保存枚数を『print』で表示します
#------------------------------------------------
#カメラを終了
cap.release()
#ウィンドウを閉じる
cv2.destroyAllWindows()
#------------------------------------------------
#全枚数に対して,顔と目を何枚認証したか?
print(detect_N, "/", all_N, "枚の画像を保存しました")
print("保存率={}%".format(int((detect_N/all_N)*100)))
#------------------------------------------------
これを実行すると,このように保存したい枚数を聞かれるので,
『120』と書き込むと,顔画像の保存が始まります.


終わりに
今回は,顔をカスケードファイルで検出し,保存枚数を指定して,ディレクトリに保存しました.
入力画面で自由に保存枚数を決めることができるので,アプリなどを作る際に,使えると思います^^
それでは・・・