画像の読み込み
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で人物の顔にモザイク処理を行う


コメント