2013/02/17

デスクトップJavaからOpenCVを使う

OpenCV2.4.4から、デスクトップ用のJavaもサポートされるようになりました。
今日時点(2013-02-17)では、OpenCV2.4.4はベータ版として入手することができます。


Javaバインディングのチュートリアルがあったので、早速読んでみました。
毎度おなじみ適当翻訳です。画像や長いコードは省略してますので、元ページを参照ください。

Introduction to Java Development

=============================================

Java開発の始めかた

OpenCV2.4.4から、OpenCVはデスクトップJavaをAndroid開発向けと同じようなインターフェースでサポートしました。このガイドでは、JavaやScalaでOpenCVを使ったアプリケーションの作り方を説明します。私たちはアプリケーションをビルドするために、Eclipse,Apache AntやSimple Build Tool (SBT)を使用します。

このガイドを読んだあとにIntroduction into Android Development チュートリアルも読んでみましょう。

このガイドですること

このガイドでは、私達は

  • デスクトップJavaをサポートしたOpenCVを入手します
  • Ant,EclipseまたはSBTプロジェクトを作成します
  • ScalaまたはJavaを使って、簡単なOpenCVアプリケーションを書きます

同じ手順がsamples/javaフォルダを作るために使われたので、迷った場合はこれらのファイルを参照してください。

デスクトップJavaをサポートしたOpenCVを入手する
まずはJavaバインディングを含んでいるOpenCVのバージョン2.4.4が必要です。
一番簡単な手順は、SourceForgeのOpenCVリポジトリからバージョン2.4.4またはそれ以上のパッケージをダウンロードすることです。
 注:WindowsユーザはJavaを使った開発に必要なファイルをopencv/build/javaフォルダで見つけることができます。他のOSの場合は、これらをソースからビルドする必要があります。

もう一つは、OpenCVのgitリポジトリから取得する方法です。また、OpenCVのJavaバインディングをビルドするには、JDK (Oracle/Sun JDK 6か7が推奨),Apache AntとPython v2.6以上がインストールされていなければなりません。

OpenCVをビルドする
さぁ、OpenCVをビルドしましょう

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

MakefilleやVisual Studio用のソリューションを生成するには、
    cmake -DBUILD_SHARED_LIBS=OFF ..
オプションを使います。
注: OpenCVライブラリを静的ライブラリセットとしてビルドした場合(-DBUILD_SHARED_LIBS=OFFオプション)、Javaバインディングの動的ライブラリは十分な機能を持っています(他のOpenCVライブラリに依存していませんが、OpenCVのコードをすべて持っています)

CMakeの出力を調べて、javaがビルドされるモジュールに含まれているかを確認してください。もし無ければ、javaをビルドするための依存関係が満たされていません。CMakeの出力を確認して、何が足りないかをトラブルシューティングする必要があります。

ではビルドを始めましょう
     make -j8
または
     msbuild /m OpenCV.sln /t:build /p:Configration=Release /v:m

これでJavaインターフェースを含んでいるjarファイル(bin/opencv_2.4.4jar)とネイティブの動的ライブラリ(bin/Release/opencv_java244.dll か bin/libopencv_java244.so)がビルドされます。これらのファイルは後で使います。

簡単なJavaサンプルとそれ用のAntビルドファイルを作る
省略

Eclipseで簡単なJavaプロジェクトを作る

EclipseIDEでOpenCVを使ったJavaプロジェクトの可能性を見てみましょう。
・Eclipseで新しいワークスペースを作ります
・File -> New -> Java projectを選んで、Javaプロジェクトを新しく作ります。名前はHelloCVとしておきます。
・Project PropertiesダイアログのJava build pathタブを開きます。そして、追加のライブラリ(OpenCV)への参照を追加します。 (私の環境では/usr/local/share/OpenCV/javaでした)

・アプリケーションのエントリポイントを持った新しいJavaクラス(Mainクラス)を追加します。

・OpenCV用の呼び出しコードを追加します。
    import org.opencv.core.CvType;
    import org.opencv.core.Mat;

    public class Main {
        public static void main(String[] args) {
            System.loadLibrary("opencv_java244");
            Mat m  = Mat.eye(3, 3, CvType.CV_8UC1);
            System.out.println("m = " + m.dump());
        }
    }

・Runを押して、単位行列がコンソールに表示されることを確認しましょう。

ScalaとJavaを使ったSBTプロジェクトのサンプルを作る
省略


OpenCV jarファイルをコピーして、簡単なアプリケーションを作る
OpenCVを使って、簡単な顔検出アプリケーションを作ってみましょう。
まず、libフォルダを作ってOpenCVのjarファイルをその中にコピーします。
標準では、SBTはlibフォルダを検索パスに自動的に追加します。オプションで、sbt eclipce コマンドを実行するとEclipseプロジェクトをアップデートすることもできます。
次に、src/main/resourcesフォルダを作って、Lenaの画像をそこにコピーします。
lena.pngがそのフォルダにあることを確認してください。resouresフォルダはJavaアプリケーションの実行時に利用可能になります。
次に、lbpcascade_frontface.xmlファイルを opencv/dataフォルダからresourcesディレクトリにコピーしてきます。
 cp /data/lbpcascades/lbpcascade_frontalface.xml src/main/resources/

そしてsrc/main/java/HellloOpenCV.javaファイルを作ります。
 コード省略

System.loadLibrary("opencv_java244")がOpenCVの関数を実行する前に確実に一度だけ実行されることを確認してください。loadLibraryを実行しなかった場合は、UnsatisfiedLinkエラーが発生します。また、すでにOpenCVライブラリが読み込まれている状態で更に読み込もうとした場合にも発生します。
では sbt runを実行して、顔検出アプリを起動してみましょう。

==============================================



というわけで早速OpenCV 2.4.4を持ってきましょう
今回はgitのリポジトリをもらってきました。
  git-opencv2.4$ git clone git://code.opencv.org/opencv.git
  Cloning into 'opencv'...
  remote: Counting objects: 82644, done.
  remote: Compressing objects: 100% (24460/24460), done.
  remote: Total 82644 (delta 58152), reused 74716 (delta 51522)
  Receiving objects: 100% (82644/82644), 287.72 MiB | 436 KiB/s, done.
  Resolving deltas: 100% (58152/58152), done.

CMakeを実行したところ、
-- Could NOT find JNI (missing:  JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH)
というメッセージがでてopencv_javaがビルド対象になっていません。

OracleのJava7とAnt、Python2.7をインストールしてから下記コマンドでもう一度CMakeしました。

cmake -DBUILD_SHARED_LIBS=OFF \
-DJAVA_INCLUDE_PATH=/usr/lib/jvm/java-7-oracle/include \
-DJAVA_INCLUDE_PATH2=/usr/lib/jvm/java-7-oracl/inlclude/linux \
-DJAVA_AWT_INCLUDE_PATH=/usr/lib/jvm/java-7-oracle/jre/lib/i386  ..

これで無事ビルド対象になりました。あとはmakeしてインストールします。

   sudo make -j8 && sudo make install

(make中に"jni_md.hが見つかりません"的なメッセージが出たら、検索パスを変更してみてください)


インストールが終わったのでEclipseで単位行列を表示するチュートリアルを作ったのですが、実行時に”ライブラリないよ”というエラーが出て来ました。
チュートリアルでは
    system.loadLibrary("opencv_java244");
となっていますが、ビルドされたファイル名が libopencv_java.so なので、
    system.loadLibrary("opencv_java");
に変えるとうまく動きました。

現時点では、highguiは完全にはラップできておらず、imshowやnamedWindowなどの表示関係の関数は使用できないようです。とはいえ、デスクトップJavaでもOpenCVが使えるようになったので、Android用にコードを作るのがちょっと楽になりそうですね。

ではまた。

0 件のコメント:

コメントを投稿