OpenCVで顔認識・顔検出を簡単に行う方法【Python】

OpenCVで顔認識・顔検出を簡単に行う方法【Python】 プログラミング

顔認識や顔検出を気軽に試してみたいと思いませんか?
実際に自分でやるといろいろと見えてくることもあります。

この記事では、簡単に顔認識・顔検出を試す方法を解説していきます。

本記事の内容

  • PythonでOpenCVを動かす準備
  • OpenCVで顔認識・顔検出を行う
  • OpenCVのエラー

それでは、上記に沿って解説していきます。

PythonでOpenCVを動かす準備

OpenCVのインストールが必要です。
OpenCVのインストールには、次の記事を参考にしてください。

次は、顔認識・顔検出用のカスケード分類器のファイルをダウンロードです。
「カスケード分類器?」となるかもしれません。

機械学習的に言うと、顔画像を膨大に学んだモデルみたいなモノになります。
公式がGitHub上に置いてあるXMLファイルをダウンロードしましょう。
https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml

残るは、顔認識・顔検出したい画像ですね。
jpgで用意してください。

今回は、このは画像を顔認識・顔検出してみます。
ファイル名は、face.jpgです。

ローカルで検証するので、自分の顔画像でもいいと思います。
Webサービスなどでは、怖くて自分の顔写真なんてアップできません。

すべて準備ができたら、実際に顔認識・顔検出を試しましょう。

OpenCVで顔認識・顔検出を行う

OpenCVで顔認識・顔検出するためにコードは以下。

import cv2

XML_PATH = "haarcascade_frontalface_default.xmlのパス"
INPUT_IMG_PATH = "読み込む画像のパス"
OUTPUT_IMG_PATH = "出力する画像のパス"

classifier = cv2.CascadeClassifier(XML_PATH)

img = cv2.imread(INPUT_IMG_PATH)
color = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

targets = classifier.detectMultiScale(color)

for x, y, w, h in targets:
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

cv2.imwrite(OUTPUT_IMG_PATH, img)

たった、これだけで顔認証・顔検出ができてしまいます。
各自で変更が必要なのは、次の値です。

XML_PATH = "haarcascade_frontalface_default.xmlのパス"
INPUT_IMG_PATH = "読み込む画像のパス"
OUTPUT_IMG_PATH = "出力する画像のパス"

XML_PATHは、ダウンロードしたカスケード分類器のファイルのパスです。
INPUT_IMG_PATHは、顔が映っているjpg画像のパスとなります。
OUTPUT_IMG_PATHは、顔認識・顔検出した後の結果画像のパスです。

例えば、次のような値を設定します。

XML_PATH = "C:\opencv\haarcascade_frontalface_default.xml"
INPUT_IMG_PATH = "C:\opencv\img\face.jpg"
OUTPUT_IMG_PATH = "C:\opencv\img\face_out.jpg"

上記のサンプルコードを実行すると、OUTPUT_IMG_PATHに画像ができているはずです。

手前にいる顔の見えない女性以外は、すべて顔認識ができています。
今回の画像では、ほぼ満点の出来ですね。

どうでしたか?
想像以上に簡単に顔認識・顔検出ができたと思います。

最後にエラーが出た場合について、記しておきます。
エラーが出なかったなら、以下は読む必要はありません。

追記 2021年10月23日
「手前の女性の顔も認識したい」という方は、次の記事をご覧ください。

OpenCVのエラー

この記事のサンプルコード実行時、エラーが出た場合の対処方法をまとめておきます。

XMLの読み込みでエラーが発生

このケースでは、次のエラーが表示されています。

error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'

detectMultiScale関数がないという内容です。
これは、正常にカスケード分類器のファイルを読み込めていないことが原因です。

XML_PATHのパス設定が、適切ではないということになります。
適切にパスを設定すれば、このエラーは解決するはずです。

画像の読み込みでエラーが発生

このケースでは、次のエラーが表示されています。

error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

INPUT_IMG_PATHのパス設定が、適切ではないことが原因です。
適切にパスを設定すれば、このエラーは解決するでしょう。

タイトルとURLをコピーしました