OpenCV3.1をOSXでJava(Eclipse)で実行する

OpenCV3をMacで使おうと思ったらかなり苦労したのでメモしておきます。

最初OpenCV3をGitでチェックアウトして使おうと思ったら迷走しました。

Windowsであればexeを実行してすぐ使える状態なんですが、Macだと苦労・・・

結局Homebrewで入れたんですが、それでも一曲あったので実行できるまでの流れをメモしておきます。

環境

1.OpenCV3.1を入れる

※Homebrewが使えることを前提に進めます。

brew tap homebrew/science
brew install opencv3 --with-java

--with-javaでjarが用意されます。
最初この指定を忘れていて、用意されなかったので一旦アンインストールしました。

brew uninstall opencv3

その後再度installしようとすると以下のエラーがでました。

Error: You must `brew link eigen libpng libtiff ilmbase openexr numpy` before homebrew/science/opencv3 can be installed

brew linkしろって言ってるので言われてる通りしてみます。

brew link libtiff ilmbase openexr numpy

するとまたエラー。。。

Error: Could not symlink lib/pkgconfig/libtiff-4.pc
/usr/local/lib/pkgconfig is not writable.

権限の問題なので付与します。

sudo chmod g+w include/

無事インストールできたら以下のような構成になると思います。

/usr/local/Cellar/opencv3/3.1.0_1/share/OpenCV/java/

  • libopencv_java310.so
  • opencv-310.jar

これでOpenCVの用意は完了です。
次はEclipseで使えるようにしましょう。

Eclipseにライブラリを取り込む

Eclipseで新しいJavaプロジェクトを作成して、ライブラリを単純に追加というわけではなく、jarを追加したあと、ネイティブライブラリとして追加する必要があります。

そこら辺の記述はググればいっぱいでてきますが、日本語で説明している記事見つけたのでリンク貼って割愛します。

JavaでOpenCVのインストール・eclipseの設定など(Mac OSX) | takuroYONEZAWA

※記事では2.4.4ですが、3.1.0に読み替えてください。

追加するjarのパスは上記でも説明したとおり以下です。 * /usr/local/Cellar/opencv3/3.1.0_1/share/OpenCV/java/opencv-310.jar

で、問題のネイティブライブラリですが、作成されたファイルはlibopencv_java310.soです。
Macでの実行なので、拡張子を変更してlibopencv_java310.dylibにします。

よってネイティブライブラリのパスは以下です。 * /usr/local/Cellar/opencv3/3.1.0_1/share/OpenCV/java/libopencv_java310.dylib

OpenCVでいうHelloWorld

OpenCV java」とググるとよく見るサンプルのコードを実行することで、動作が正しく動くかの確認ができるようです。

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
 
public class Hello {
    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat m  = Mat.eye(3, 3, CvType.CV_8UC1);
        System.out.println("m = " + m.dump());
    }
}
実行結果

m = [ 1, 0, 0;
0, 1, 0;
0, 0, 1]

うまくいくと上記のような結果が表示されます。

ネイティブライブラリのパスが正しく書かれているかは以下で確認できます。

System.out.println(System.getProperty("java.library.path"));

とりあえず今日は動くところまで!

以上ですー。