OpenCVで笑顔検出

OpenCVで笑顔検出したい場合(Haar-like 特徴を用いたカスケード分類器)の実装方法を解説します。

images/cards/lena.webp

目次

OpenCV で笑顔検出したい

OpenCV で用意されている Haar-like 特徴を用いたカスケード分類器により、笑顔検出を実施します。 対象画像から探索窓毎に 複数の Haar-like 特徴を計算し、笑顔パターンがあるかないかをカスケード分類器により判定します。

OpenCVで笑顔検出1

Python での実装方法

カスケード分類器の誤検出が多いため、顔検出した領域において笑顔検出を実施します。

import cv2

# 入力画像の読み込み
img = cv2.imread("beautiful-girl.jpg", cv2.IMREAD_COLOR)

# カスケード型識別器の読み込み
cascade_face = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
cascade_smile = cv2.CascadeClassifier("haarcascade_smile.xml")

# カラー画像からグレースケール変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 顔領域の探索
faces = cascade_face.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(50, 50))

# 顔領域を赤色の矩形/笑顔領域を緑色矩形で囲む
for (x, y, w, h) in faces:
    gray_face = cv2.cvtColor(img[y:y+h, x:x+w, :], cv2.COLOR_BGR2GRAY)
    smiles = cascade_smile.detectMultiScale(gray_face, scaleFactor= 1.1, minNeighbors=3, minSize=(30, 30))
    for (xs, ys, ws, hs) in smiles:
        cv2.rectangle(img, (x+ xs, y+ ys), (x+ xs + ws, y+ ys + hs), (0,255,0), 2)
        cv2.rectangle(img, (x, y), (x + w, y+h), (0,0,255), 3)

# 結果を出力
cv2.imwrite("result_smile.jpg",img)

関連記事