OpenCVでカスケード型分類器を使った顔検出と瞳検出(顔認識と瞳認識)を行う。以下に公式のチュートリアル(英語)がある。カメラを使ってリアルタイムで顔検出と瞳検出について説明する。スポンサーリンク画像ファイルを読み込んで顔検出・瞳検出を行うサンプルコードまず最初に画像ファイルを読み込んで顔検出と瞳検出を行うサンプルコードを示す。説明およびリアルタイム処理のサンプルコードは後述。opencv_face_eye_detection.pyカスケード型分類器の読み込みMacにhomebrewでopencv3をインストールした場合、/usr/local/opt/opencv/share/OpenCV/haarcascades/に学習済のHaar-like特徴を用いた分類器のデータ(xmlファイル)がある。xmlファイルの場所がわからない場合は、GItHubのレポジトリからダウンロードして任意の場所に置いてもいい。opencv/opencv以下のようにいくつかの種類のデータが用意されている。haarcascade_smile.xmlcv2.CascadeClassifier()でパスを指定してxmlファイルを読み込む。読み込んだ検出器のメソッドdetectMultiScale()で顔や瞳(目)などを検出する。高さ)のリスト(配列)が返される。Reference上のサンプルコードでは、まず顔を検出し、その顔に対して瞳(目)の検出をしている。引数としてグレースケール(白黒)の画像データを渡す。カラー画像からグレースケール(白黒)画像への変換はcv2.cvtColor()で行う。そのほか以下のような引数を指定できる(省略可能)。scaleFactor(初期値1.1)minNeighbors(初期値3)detectMultiScale()では様々なスケールで検出を行うが、それぞれのスケールの縮小量を定義するのがscaleFactor。scaleFactorの値が小さいとスケールを細かく変更して検出するため、見落としは少ないが処理時間がかかる。様々なスケールで検出した結果、同じエリアで重複して検出される。いくつ重複した場合に真とみなすかを定義するのがminNeighbors。minNeighborsの値が小さいと重複が少ない領域も真とするため、見落としは少ないが誤検出が増える。scaleFactorもminNeighborsも対象となる画像や使用する検出器のデータなどによって最適な値は異なるが、基本的には初期値のままでもある程度は検出できる。検出領域に対して処理(枠描画、塗りつぶし、モザイク)上のサンプルコードでは、cv2.rectangle()で検出した領域の枠を描画している。図形描画については以下の記事を参照。)検出した領域を塗りつぶす場合はcv2.rectangle()で塗りつぶしてもいいし、以下のようにも書ける。opencv_face_eye_detection.py検出した領域にモザイクをかけたりすることもできる。opencv_face_eye_detection.pyモザイク処理についての詳細は以下の記事を参照。OpenCVで画像にモザイク処理(全面、一部、顔など)カメラを使ってリアルタイムで顔検出と瞳検出カメラ(USBカメラ・Webカメラ・内蔵カメラ)の動画をリアルタイムで処理することも可能。OpenCVにおける動画の扱いの基本的な内容は以下の記事を参照。OpenCVで動画を読み込み(ファイル・カメラ映像)キャプチャした各フレームに対して上述の画像ファイルの場合と同様の処理を行えば、リアルタイムで顔検出や瞳検出をすることができる。サンプルコードは以下の通り。