OpenCVをJavaから使う


これまで、自前のライブラリでWebカメラから画像をとってきて、ARToolKitに渡してマーカー検出したりしていたのですが、画像処理関連の研究を始めたりして、そろそろ限界を感じるようになってきたので、JavaからOpenCVの各機能が呼べるラッパーJavaCVを使ってみることにしました。

インストールおよび実行までの道のりが果てしなく遠い…かと思いきや、意外とすんなりできました。

2014/1/26追記; JavaCVのバージョンがあがって、使い方がもっとシンプルになりました。詳しくは新しい記事をご覧ください。

64-bit WindowsでJavaCV

  1. OpenCVのバイナリ版(OpenCV-*.exe, 自己展開ZIP)をダウンロードして適当なディレクトリ(C:¥opencvなど)に解凍
  2. Visual C++ 2010のランタイムをインストール
  3. 環境変数PATHを編集してパスを.¥build¥common¥tbb¥intel64¥vc10と.¥build.¥x64¥vc10¥binに通す
  4. JavaCV(javacv-*-bin.zip)をダウンロードして適当なディレクトリ(C:¥opencv¥javacvなど)に解凍
  5. コンパイル、実行するときのJavaのクラスパスにjavacpp.jar, javacv.jar, javacv-windows-x86_64.jarを追加

64-bit Mac OS XでJavaCV

  1. MacPortsをインストール
  2. コマンドラインで sudo port install opencv +python27 を実行
  3. JavaCV(javacv-*-bin.zip)をダウンロードして適当なディレクトリ(/Users/*/lib/javacvなど)に解凍
  4. コンパイル、実行するときのJavaのクラスパスにjavacpp.jar, javacv.jar, javacv-macosx-x86_64.jarを追加

以上です。

どちらの場合でも注意すべき内容としては、Java VM、OpenCVのビット数が合っていなくてはなりません。僕の環境では、古い研究プロジェクトを動かすため、Java VMが32ビットで起動するよう-d32オプションをつけていました。ところが、OpenCVが64ビット版だったため、プログラムを走らせようとすると “java.lang.UnsatisfiedLinkError: Library jniopencv_core not found” というエラーが出てしばらく困りました。

JavaCVが正しくインストールできると、Webカメラから画像を読みとってウィンドウに表示するプログラムが、次のように簡単に書けます。

import javax.swing.JFrame;

import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.cpp.opencv_core.IplImage;

public class CaptureImage {

	public static void main(String[] args) {
		new CaptureImage().loop();
	}

	private void loop() {
		CanvasFrame canvas = new CanvasFrame("Webcam");
		canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// デフォルト(0)のWebカメラを使う
		OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
		try {
			grabber.start();

			// フレームレートを取得
			double frameRate = grabber.getFrameRate();
			long wait = (long) (1000 / (frameRate == 0 ? 10 : frameRate));

			// 画像を取りつづける
			while (true) {
				Thread.sleep(wait);
				IplImage image = grabber.grab();

				// 取ってきた画像を画面に表示
				if (image != null) {
					canvas.showImage(image);
				}
			}

		// 何かあったらエラーを吐いて終わる
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

3 Responses to “OpenCVをJavaから使う”

Trackbacks and Pingbacks:

  1. JavaCVで機械学習する | junkato.jp

    […] この便利な機能は、Java版ラッパーであるJavaCVにもポーティングされています。そこで、とりあえず5次元ベクトル群を2つのクラスに分類するコードを書いてみました。下の画像では、5次元中2次元を可視化しています。他のパラメタで実行してみた画面キャプチャやコード全体は記事末尾にあります。JavaCVのインストールなどに関しては前の記事「OpenCVをJavaから使う」をどうぞ。 […]

  2. JavaでOpenCVを使ってみる | ケセラセラ

    […] まずはこちらのIntroduction to Java Developmentを参考にしました。 […]

  3. OpenCVをJavaから使う (改訂版) | junkato.jp

    […] 1年以上前にOpenCVの非公式なJavaラッパーJavaCVを使う方法について記事を書いたのですが、その後、OpenCVの公式なJavaラッパーが公開されたり、JavaCVのバージョンが上がったりして、色々と状況が変わっています。 […]

Leave a Reply

  • (will not be published)