0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonとOpenCVで実現するHaarcascadeによる顔認識

Last updated at Posted at 2021-09-04

作成の経緯

もともとは高校の授業でC#を使った顔認識プログラムを作成しており、その際にOpenCVのHaarcascadesを利用していました。Pythonでも同様の機能を実装してみたいと思い、今回のサンプルコードを作成しました。

準備するもの

  1. Python環境(バージョン3.x)

    • Python 3.7以降であればOpenCVとの互換性が高く、動作も比較的安定します。
    • Anacondaなどのディストリビューションを使用している場合は、その仮想環境上で行うのも良いでしょう。
  2. OpenCVのインストール

    • コマンドプロンプト、ターミナルなどで以下を実行します。
      pip install opencv-python
      
    • Anaconda環境の場合は、
      conda install -c conda-forge opencv
      
      としてもインストールできます。
  3. カスケード分類器のダウンロード

    • OpenCVの公式リポジトリからHaarcascade Frontal FaceのXMLファイルをダウンロードしてください。
    • 具体的にはhaarcascade_frontalface_default.xmlを取得します。
    • ダウンロードしたファイルを、この後に示すPythonスクリプトと同じディレクトリに配置します。
    • 異なるディレクトリに置きたい場合は、後述するコードのパス(cascade_path)を修正してください。

コード例

import cv2

# カメラのキャプチャを開始(0はPCに接続されたカメラのインデックス)
capture = cv2.VideoCapture(0)

# カスケード分類器(Haarcascade)のパスを指定
cascade_path = "./haarcascade_frontalface_default.xml"
cascade = cv2.CascadeClassifier(cascade_path)

while True:
    # フレームを読み取る
    ret, frame = capture.read()
    if not ret:
        # カメラから正しくフレームが取得できなかった場合はループを抜ける
        print("カメラから映像を取得できませんでした。")
        break
    
    # グレースケールに変換
    image_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 顔を検出
    # パラメータの調整で検出精度を変えられる(例:scaleFactor, minNeighbors, minSizeなど)
    facerect = cascade.detectMultiScale(
        image_gray,
        scaleFactor=1.1,  # 画像スケールをどの程度縮小して検出を行うか
        minNeighbors=5,   # 顔と判定する際に必要な近傍矩形数
        minSize=(30, 30)  # 最小検出サイズ
    )
    print('\nDetected face coordinates:', facerect, end='')

    # 顔が検出された場合、四角形で囲む
    for (x, y, w, h) in facerect:
        xy1 = (x, y)
        xy2 = (x + w, y + h)
        color = (255, 0, 0)  # 青色
        width = 2            # 枠線の太さ
        cv2.rectangle(frame, xy1, xy2, color, width)

    # フレームを表示
    cv2.imshow('face camera', frame)

    # キー入力を1ms待ち、'q'キーが押されたら終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# キャプチャを解放し、ウィンドウを閉じる
capture.release()
cv2.destroyAllWindows()

コードのポイント

  • cv2.VideoCapture(0)
    PCに接続されたカメラを起動します。複数カメラがある場合には、インデックスを切り替えて指定します。
  • detectMultiScaleメソッドのパラメータ
    顔検出の精度やパフォーマンスに関わります。必要に応じて値を変更してみてください。
  • cv2.rectangle
    検出された顔領域に枠を描画します。色や太さは自由に変更できます。
  • print('\nDetected face coordinates:', facerect, end='')
    コンソール上にも検出結果の座標が表示されます。デバッグなどに便利です。
  • 終了方法
    ウィンドウ上にフォーカスをあて、qキーを押すとプログラムが停止します。

実行手順

  1. ターミナルまたはコマンドプロンプトを開き、スクリプトがあるディレクトリに移動
  2. python ファイル名.py (または python3 ファイル名.py) を実行
  3. カメラが起動して、検出結果がリアルタイムで表示されることを確認
  4. 終了するときは、ウィンドウをアクティブにして qキーを押す

よくあるトラブルシューティング

  1. カメラが起動しない・retがFalseになる

    • PCにカメラが物理的に接続されているか確認します。
    • ノートPCの場合はカメラが無効化されていないか、ドライバが正しくインストールされているか確認しましょう。
    • VideoCapture(1)などインデックスを変更してみるのも有効です。
  2. 顔が検出されない

    • scaleFactor, minNeighbors, minSizeのパラメータを調整してみてください。
    • 明るい場所、カメラが顔にしっかり向く角度に調整する、など撮影環境の改善も重要です。
  3. XMLファイルが見つからないエラーが出る

    • ダウンロードしたhaarcascade_frontalface_default.xmlが正しいディレクトリに存在するか再度確認します。
    • ファイルパスをフルパスに変更してみるのも一つの方法です。

あとがき

このプログラムは基本的なHaarcascadeによる顔検出デモです。古典的な手法ではありますが、環境依存が少なく、比較的高速に動作します。
さらに高精度な検出や顔認証(誰の顔かを識別する)などを行いたい場合は、DNNベースのモデルやdlibなど他のライブラリを検討すると良いでしょう。
また、本記事のコード断片は複数のサンプルやドキュメントを参照して作成しており、オリジナルの引用元を特定できない部分があります。ご参考にしていただく方々にはこの場を借りてお詫び申し上げます。

以上が、Haarcascadeを使用したPythonでの顔認識プログラムの概要および実装例です。ぜひご自身の環境で動かしてみて、パラメータ調整や機能拡張などを行ってみてください。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?