Opencv3.1で顔検出

かおかおかおーかおかおかーおーかおかおかおー by たくみ

ということで顔検出してみる。

Opencvインストール

http://opencv.org/downloads.html
からDLした3.1を適当に解凍。以後の例では「C:\tool\opencv-3.1.0」に解凍したとしてすすめます。
3系と2系でAPIが結構変わっているので古いサンプルを動かしたい人は2系のほうがいいかもしれませんが、私は最新版で行きます。

Javaから使う準備

Javaから呼び出すには2つ作業が必要です
1、「C:\tool\opencv-3.1.0\build\java\opencv-310.jar」をクラスパスに通す
2、「C:\tool\opencv-3.1.0\build\java\x64\opencv_java310.dll」にパスを通す
2はめんどくさいので、手抜きするなら該当のDLLをプロジェクトフォルダ直下にコピーしましょう。

カスケード分類の用意

C:\tool\opencv-3.1.0\sources\data\haarcascades にあるhaarcascade_frontalface_default.xml を同じくプロジェクトフォルダ直下におきましょう。

動かしてみる

こんなソースを書きます。
http://opencv.blog.jp/java/face_detect
が2系のソースなので「org.opencv.highgui.Highgui」ではなく「org.opencv.imgcodecs.Imgcodecs」で読み書きをするように書き換えました。

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.objdetect.CascadeClassifier;

public class 顔検出 {

    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // 入力画像の取得	
        Mat im = Imgcodecs.imread("input.jpg");
        // カスケード分類器で顔探索
        CascadeClassifier faceDetector = new CascadeClassifier("haarcascade_frontalface_default.xml");
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(im, faceDetections);
        // 見つかった顔を矩形で囲む
        for (Rect rect : faceDetections.toArray()) {
            Imgproc.rectangle(im, new Point(rect.x, rect.y),
                    new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 0, 255), 5);
        }
        // 結果を保存
        Imgcodecs.imwrite("ouput.png", im);
    }
}

んで実行すると、、、

f:id:GARAPON:20160913175405p:plain
5名中4名は見えました。さすがに横顔は無理ですね。しかしすげー世界だなーいろいろらくだなー


顔写真はココから借用 http://www.photo-ac.com/