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

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)