OpenCVには顔検出用に学習したカスケード型識別器の学習結果があるので、それを使って顔検出してみました。
識別器の学習結果は、環境・インストール方法によって保存場所が若干異なります。
Windowsの場合
C:¥OpenCV にインストールしたとすると、C:¥OpenCV¥data 以下にあります。
Linuxの場合
yumやapt-getでインストールすると、基本的には/usr/share/OpenCV/以下にあると思います。(未確認)
自分でソースコードをダウンロードしてコンパイルしてインストールしている場合は、/usr/local/share/OpenCV/以下にあると思います。
もちろん、インストール先を/usr/localから変更している場合は、その部分は変わります。
Macの場合
僕はMacで、Homebrewを使ってインストールしているのでこれに該当するのですが、この場合は/usr/local/Celler/opencv/2.4.2/share/OpenCV/以下にあります。
もちろんOpenCVのバージョンやHomebrewのインストール先によって当該部分が変わります。
自分でソースコードをコンパイルしてインストールしている場合はLinuxの時と同じで/usr/local/share/OpenCV 以下にあると思います。(未確認)
で、どういうファイルがあるかですが、上記のディレクトリの 下には、haarcascadesとlbpcascadesというディレクトリがあります。haarcascades以下には、haar-like特徴で学習した識別器のデータ(xml)が、lbpcascades以下にはLocal Binary Patterns特徴量で学習した識別器のデータがあります。
以下のソースコードでは、例として、lbpcascade_frontalface.xmlを使っています。
実際のソースコードはこちら。
#include <opencv2/opencv.hpp>; int main (int argc, char **argv){ cv::Mat img, gray; const std::string cascade_name = "/usr/local/Cellar/opencv/2.4.2/share/OpenCV/lbpcascades/lbpcascade_frontalface.xml"; cv::CascadeClassifier cascade; cascade.load(cascade_name); img=cv::imread(argv[1]); cv::cvtColor(img, gray, CV_BGRA2GRAY); cv::equalizeHist (gray, gray); std::vector<cv::Rect> faces; cascade.detectMultiScale(gray, faces); for(std::vector<cv::Rect>::iterator it=faces.begin(); it!=faces.end(); it++){ cv::rectangle(img, *it, CV_RGB(255,0,0), 3); } cv::imshow("Detected", img); cv::waitKey (0); return 0; }
上の例では、簡単のため、argv[1]で顔検出したい画像を渡しています。