かおかおかおーかおかおかーおーかおかおかおー 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); } }
んで実行すると、、、
5名中4名は見えました。さすがに横顔は無理ですね。しかしすげー世界だなーいろいろらくだなー
顔写真はココから借用 http://www.photo-ac.com/