OpenCVで顔検出

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

コメントする