OpenCVは画像処理と機械学習のためのオープンソースライブラリとして、幅広い分野で活用されています。
本記事では、OpenCVを使って顔検出を自動化する方法をご紹介します。プログラミング初心者でも理解しやすいように、コード例を交えながら、顔検出の仕組みから具体的な手順まで詳しく解説します。
顔検出の仕組み
顔検出は、画像中の顔領域を特定する技術です。OpenCVでは、カスケード型分類器と呼ばれるモデルを用いて顔検出を行います。カスケード型分類器は、大量の顔画像と非顔画像を用いて学習されたモデルであり、画像の特徴に基づいて顔かどうかを判断します。
以下の画像に示すようなHaar特徴量を使い、顔の特徴を判定しています。
画像参照元:
Haar Cascadesを使った顔検出 — OpenCV-Python Tutorials 1 documentation
プログラム
openCVで現在分類できるものは以下になります。
ファイル名 | 検出対象 |
haarcascade_eye.xml | 目 |
haarcascade_eye_tree_eyeglasses.xml | 眼鏡 |
haarcascade_frontalcatface.xml | 猫の顔(正面) |
haarcascade_frontalcatface_extended.xml | 猫の顔(正面) |
haarcascade_frontalface_alt.xml | 顔(正面) |
haarcascade_frontalface_alt2.xml | 顔(正面) |
haarcascade_frontalface_alt_tree.xml | 顔(正面) |
haarcascade_frontalface_default.xml | 顔(正面) |
haarcascade_fullbody.xml | 全身 |
haarcascade_lefteye_2splits.xml | 左目 |
haarcascade_licence_plate_rus_16stages.xml | ロシアのナンバープレート(全体) |
haarcascade_lowerbody.xml | 下半身 |
haarcascade_profileface.xml | 顔(証明写真) |
haarcascade_righteye_2splits.xml | 右目 |
haarcascade_russian_plate_number.xml | ロシアのナンバープレート(数字) |
haarcascade_smile.xml | 笑顔 |
haarcascade_upperbody.xml | 上半身 |
今回は、以下画像から「haarcascade_frontalface_default.xml」を使い、人の正面の顔を判別するプログラムを作成してみます。
以下コードで顔検出を行っています。
Python
import cv2
# 画像を読み込む
image = cv2.imread('sample_1.jpg')
# カスケード型分類器を読み込む
detector = cv2.CascadeClassifier('../../../../anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
# 画像から顔を検出する
faces = detector.detectMultiScale(image, 1.1, 4)
# 検出した顔に矩形を描画する
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 画像を表示する
cv2.imshow('Face Detection', image)
# 待機する
cv2.waitKey(0)
# 画像を閉じる
cv2.destroyAllWindows()
結果
画像から人の顔を検出することができました。
手前の人はボケているのもあり、今回は検出できませんでした。より精度の向上が必要ですね。
まとめ
今回はopencvを使って画像から人の顔を検出するプログラムを作成してみました。
精度はまずまずの結果でしたが、一応検出はできました。
OpenCVを使って顔検出を自動化することで、画像処理の新たな可能性が広がります。本記事を参考に、ぜひ様々な画像処理アプリケーションを作ってみてください。
ちなみに顔検出の応用例として代表的なところとしては以下のようなところがあげられます。
- セキュリティシステム: 防犯カメラの映像から人物を検出
- アクセス制御: 顔認証による入退室管理
- 写真整理: 写真中の顔に基づいて自動的に分類
- 医療画像解析: レントゲン画像から患者の顔の位置を特定
コメント