前回の投稿で、OpenCVを使った顔認識の簡単な実例を紹介した。

今回は、検出に成功した顔部分のみを切り取り、別の画像として保存する方法を紹介する。

サンプルで使う画像の用意

今回は「写真AC」から複数の人物写真を用意した。

この外国人6名の写真を使って、それぞれの人物の顔のみを切り取った画像を生成する。

基本のコード

基本のコードは前回の記事で紹介したので、詳しい説明は割愛する。

import cv2

image = cv2.imread('sample_img.jpg')

cascade_file = 'haarcascade_frontalface_alt2.xml'
cascade_face = cv2.CascadeClassifier(cascade_file)

# 顔を探して配列で返す
face_list = cascade_face.detectMultiScale(image, minSize=(20, 20))

face_listには、検出された顔の位置やサイズ情報が格納されているので、これを使って元画像から顔部分のみをトリミングする。

顔部分をトリミングして別画像として保存

enumerate関数を使ってfor文を回す。

for i, (x, y, w, h) in enumerate(face_list):
	trim = image[y: y+h, x:x+w]
	cv2.imwrite('cut' + str(i+1) + '.jpg', trim)

まず、trim変数に元画像から検出された顔の位置情報を保存する。

そしてOpenCVのimwrite関数でtrimに名前を付けて画像を保存するだけだ。

完成したコードを実行すると以下のとおり、顔の画像が出力される。

今回は残念ながら一人だけ検出漏れがあったが、ひとまず目的どおり検出した顔の切り抜き画像を保存することはできるようになった。

今後は検出の精度をどうやって高めていくか、調べてみようと思う。