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]で顔検出したい画像を渡しています。