画像の読み込み
import os import cv2 import matplotlib.pyplot as plt import requests img_url = 'https://s3-ap-northeast-1.amazonaws.com/ledge-ai-assets/media/wp-content/uploads/2020/11/24120727/115.png' r = requests.get(img_url) img_path = 'sample.jpg' with open(img_path, 'wb') as saveFile: saveFile.write(r.content) img = cv2.imread(img_path)
<実行結果>
このようにすることでOpenCVで対象の画像データを扱えるようになります。
読み込んだ画像を確認した場合は以下のように記述します。
# 画像の表示 plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # OpenCV は色がGBR順なのでRGB順に並べ替える plt.show()
顔を検出する
メイン処理である顔検出はcv2.CascadeClassifier関数で行っています。
# 分類器の読み込み face_cascade_path = '/content/haarcascade_frontalface_default.xml' face_cascade = cv2.CascadeClassifier(face_cascade_path)
なお、この関数は「haarcascade_frontalface_default.xml」を使っています。
このファイルは、OpenCVで使用する検出器です。
公式検出器はGithubからダウンロードできます。
https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
顔と思われる部分を判定する
facerect = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30)) facerect
これで顔と思われる範囲の座標が戻り値として取得できました。
これがちゃんと顔の輪郭を捉えられているか、囲ってプロットしてみましょう。
color = (255, 255, 255) #白 # 検出した場合 if len(facerect) > 0: #検出した顔を囲む矩形の作成 for rect in facerect: cv2.rectangle(img, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2) #認識結果の保存 cv2.imwrite('xxx.jpg', img)
<実行結果>
ちゃんと顔の部分が四角形で囲まれていれば認識成功です。
関連記事:【Python】Face RecognitionとOpenCVで人物の顔にモザイク処理を行う
コメント