顔検出_保存枚数の指定

ゆうき( @BASEBALLY15 )です^^

カスケードファイルで顔を検出できたのですが,保存枚数を自由に決めたいです・・・

分かりました^^
それでは,今回は,検出した顔画像の保存枚数を自由に決める方法をご紹介します.

お願いします・・・

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

顔検出後に枚数を指定して保存
(PowerPointで作成)

まず,カスケードファイルを使って,顔を検出します.

そして,『保存枚数=』と表示されるので,『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』と書き込むと,顔画像の保存が始まります.

終わりに

今回は,顔をカスケードファイルで検出し,保存枚数を指定して,ディレクトリに保存しました.

入力画面で自由に保存枚数を決めることができるので,アプリなどを作る際に,使えると思います^^

それでは・・・

Q &A

コメントを残す

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

CAPTCHA