2013年4月29日月曜日

Processing + OpenCV

Mac OS XのProcessingでOpenCVを使おうとしてちょっと手間取ったのでメモ.

以下,インストール方法.

インストール方法


OSのバージョンは以下のとおり.
$ uname -a
Darwin macserver.local 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64 x86_64



opencvはportでインストール.バージョンは2.4.5.
$ sudo port install opencv
$ sudo port list | grep opencv
Password:
opencv                         @2.4.5          graphics/opencv


processingにjavacvproライブラリをインストールする.

ダウンロードは下記URLから


最新バージョンは0.5.

インストールはシンプル.
展開したファイルをprocessingのlibrariesディレクトリにコピーする.

$ wget  http://www.mon-club-elec.fr/mes_downloads/javacvPro-0.5.zip
$ unzip javacvPro-0.5.zip
$ mv javacvPro ~/Document/Processing/libraries/
$ cd ~/Documents/Processing/libraries/


ライブラリのインストールはこれで完了だが,このままではopencvのバージョン違いによりエラーとなるので,javacvを入れ替える.

javacvライブラリ(https://code.google.com/p/javacv/)をコンパイルする.

$ wget --no-check-certificate https://javacv.googlecode.com/files/javacv-0.5-src.zip
$ unzip javacv-0.5-src.zip
$ cd javacv
$ sudo mvn -X instal


javacvproのライブラリと入れ替える.

$ cd ~/.m2/repository/com/googlecode/javacv/javacv/0.5
$ cp javacv-0.5-macosx-x86_64.jar ~/Documents/Processing/libraries/javacvPro/library/javacv-macosx-x86_64.jar 
$ cp javacv-0.5.jar ~/Documents/Processing/libraries/javacvPro/library/javacv.jar 


javacppも入れ替える.
$ cd ~/.m2/repository/com/googlecode/javacpp/javacpp/0.5
$ cp javacpp-0.5.jar ~/Documents/Processing/libraries/javacvPro/library/javacpp.jar 


これでjavacvProが動くようになる.


試しにサンプルを動かしてみる.

processingを起動し,[File]>[Examples]の順にメニューを開く.

[Contributed Librarires]の項目に[javacvPro]の項目が表示されるので,適当なものをダブルクリックし,スケッチを実行する.

ちなみに顔認識用学習データは「/opt/local/share/OpenCV」になるので,顔認識系のサンプルでは学習データのパスを書き換える.




トラブルシューティング

今回,遭遇したエラー.

まずは,processingを64bit modeにしなかった場合のエラー.opencvは64bitライブラリとしてコンパイルされるのでprocessingを32bitモードから64bitモードへと変更しておくこと.

Exception in thread "Animation Thread" java.lang.UnsatisfiedLinkError: no jniopencv_core in  java.library.path
 at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1758)
 at java.lang.Runtime.loadLibrary0(Runtime.java:823)
 at java.lang.System.loadLibrary(System.java:1045)
 at com.googlecode.javacpp.Loader.load(Loader.java:358)
 at com.googlecode.javacpp.Loader.load(Loader.java:285)
 at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:129)
 at monclubelec.javacvPro.OpenCV.<clinit>(Unknown Source)
 at javacvpro_exemple_cascade_detect.setup(javacvpro_exemple_cascade_detect.java:45)
 at processing.core.PApplet.handleDraw(PApplet.java:2241)
 at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243)
 at processing.core.PApplet.run(PApplet.java:2140)
 at java.lang.Thread.run(Thread.java:680)


つぎはjavacvライブラリを入れ替えない場合のエラー.「libopencv_core.2.3.dylib」が見つからないといっている.シンボリックリンクを用意するだけでもエラーは回避できたが,今回はライブラリをコンパイルし直した.

Exception in thread "Animation Thread" java.lang.UnsatisfiedLinkError:  /private/var/folders/yv/dgfgdbv51slf_rmgt8w497gm0000gn/T/libjniopencv_core395287537304450378.dylib:  Library not loaded: /opt/local/lib/libopencv_core.2.3.dylib   Referenced from:  /private/var/folders/yv/dgfgdbv51slf_rmgt8w497gm0000gn/T/libjniopencv_core395287537304450378.dylib   Reason: image not found
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1827)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1703)
at java.lang.Runtime.load0(Runtime.java:770)
at java.lang.System.load(System.java:1020)
at com.googlecode.javacpp.Loader.load(Loader.java:352)
at com.googlecode.javacpp.Loader.load(Loader.java:285)
at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:129)
at monclubelec.javacvPro.OpenCV.<clinit>(Unknown Source)
at sketch_130428a.setup(sketch_130428a.java:25)
at processing.core.PApplet.handleDraw(PApplet.java:2117)
at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:193)
at processing.core.PApplet.run(PApplet.java:2020)
at java.lang.Thread.run(Thread.java:680)