OpenCV for Java

提供: fukudat
移動: 案内検索

前も後ろもわからないが、まずは http://docs.opencv.org/doc/tutorials/introduction/desktop_java/java_dev_intro.html に従って、RHEL 6.xにインストールする手順。RHEL 5.8でも試したが,簡単でない.

前準備

git, ant, Oracle JDK, cmake, xml-commons-apis が最低限必要らしい。

gitとantをインストール。

$ sudo yum install git ant xml-commons-apis

Oracle JDKは最新版のrpmをOracleからゲットして、rpmコマンドでインストール。

$ sudo rpm -Uhv jdk-7u45-fcs-bin-b18-linux-x64-xxxxx.rpm
$ export JAVA_HOME=/usr/java/latest

cmakeはRed Hatに含まれる 2.6 ではダメ。最新版を http://www.cmake.org/cmake/resources/software.html からダウンロードしてビルド。

$ tar xvfz cmake-2.8.12.tar.gz
$ cd cmake-2.8.12
$ ./bootstrap
$ make -j4
$ sudo make install

これで準備完了かな。

OpenCVのビルド

まずはgitからソースをゲット。

$ git clone git://github.com/Itseez/opencv.git
$ cd opencv
$ git checkout 2.4

コンフィグ。

$ mkdir build
$ cd build
$ cmake -DBUILD_SHARED_LIBS=OFF -DWITH_OPENMP=ON ..
  • BUILD_SHARED_LIBS=OFFにするとJNIのライブラリにスタティックリンクするらしい.
  • WITH_OPENMP=ONにするとOpenMPを使う(これはJavaとは関係ない).libgompパッケージが必要.

cmake の出力を眺めて、To be built: のところに java があることを確認する。

--   OpenCV modules:
--     To be built:                 core flann imgproc highgui features2d calib3d ml video legacy
                                    objdetect photo gpu ocl nonfree contrib java python stitching
                                    superres ts videostab
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 androidcamera

もしなかったら、前提条件の JRE, ant をチェックする。

最後にビルド。

$ make -j4

結果、以下のファイルが出来て入ればOK。

bin/opencv-246.jar
lib/libopencv_java246.so

最後にインストール.

$ sudo make install

すると,/usr/local/share/OpenCV/java/ の下に jar と so がインストールされる.

Eclipseのサンプルプロジェクト

Eclipseを起動して、新しい Java Project を作成し、HelloCV と名付ける。

Project -> Properties -> Java Build Path を開き、Libraries タブを選択。

Add Library -> User Library -> Next -> User Libraries... -> New... をクリックして、ライブラリ名 opencv-246 をインプット。OK を押して抜ける。

Add External JARs をクリックして,/usr/local/share/OpenCV/java/opencv-246.jar を入力.OKを押して抜ける.

opencv-screenshot-1.png

追加された opencv-246 の Native library location を選んで Edit... をクリック。/usr/local/share/OpenCV/javaをインプット。OK を押して抜ける。

opencv-screenshot-2.png

次のファイルを HelloOpenCV.java として src フォルダの下に置く。

import org.opencv.core.*;
import org.opencv.highgui.*;
import org.opencv.objdetect.*;

//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
class DetectFaceDemo {
	public void run() {
		System.out.println("\nRunning DetectFaceDemo");

		// Create a face detector from the cascade file in the resources
		// directory.
		CascadeClassifier faceDetector = new CascadeClassifier("data/lbpcascade_frontalface.xml");
		Mat image = Highgui.imread("data/input.png");

		// Detect faces in the image.
		// MatOfRect is a special container class for Rect.
		MatOfRect faceDetections = new MatOfRect();
		faceDetector.detectMultiScale(image, faceDetections);

		System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));

		// Draw a bounding box around each face.
		for (Rect rect : faceDetections.toArray()) {
			Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
		}

		// Save the visualized detection.
		String filename = "data/output.png";
		System.out.println(String.format("Writing %s", filename));
		Highgui.imwrite(filename, image);
	}
}

public class HelloOpenCV {
	public static void main(String[] args) {
		System.out.println("Hello, OpenCV");

		// Load the native library.
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		new DetectFaceDemo().run();
	}
}

プロジェクトの直下に data というディレクトリを作成し、その下に opencv/data/lbpcascades/lbpcascade_frontalface.xml をコピーしてくる。

$ cd ~/workspace/HelloCV
$ mkdir data
$ cp .../opencv/data/libcascades/lbpcascade_frontalface.xml data/

同じく data ディレクトリの下に顔が写っている画像ファイルを "input.png" として置く。 例えばこれ↓。

lena.png

HelloOpenCV を実行する。

すると、次のようにコンソールに出力があり、

Hello, OpenCV

Running DetectFaceDemo
Detected 1 faces
Writing data/output.png

顔検出した結果が "data/output.png" に出力される。

faceDetection.png

個人用ツール
名前空間

変種
操作
案内
ツールボックス