OpenCV 2.3.1 for Android がいい感じ

OpenCV 2.3.1 for Androidで大幅に更新があってかなり使いやすくなったので、だれとなく知ってもらいたくて記事うp
2.3.1になってJava APIが整い、サンプルコードも更新されて、だいぶすっきりしています。
(2.2のサンプルコードは死ぬほどめんどくさいことになってて、正直ひどかった)


これまではNDKで画処理できる程度で
Java-C間をやりとりするのがめんどくさかったり
処理結果をCからJavaへ渡したはいいけど、UIに渡すのにどうすりゃいいの
てな感じでしたがそこらへんがOpenCV2.3.1 for Androidですっきりと解決されています。


OpenCV for Android公式ページ
http://opencv.willowgarage.com/wiki/Android
http://opencv.willowgarage.com/wiki/AndroidPrebuiltOpenCV231


OpenCV 2.3.1 for Androidでできること

  1. NDK で OpenCV
  2. OpenCV Java APINew!
  3. MatをJNI経由でJavaからC、CからJavaへ引き渡しNew!


図にすると下のようなイメージ


簡単な画像処理であればサクッとJava APIで済ませ(図 左側ルートでOpenCVライブラリへアクセス)
まとまった処理はCでガリガリと書いてやることができます(図 右側ルートでOpenCVライブラリへアクセス)


表示系に引き渡すときはMatからBitmapへ変換(MatToBitmap)してSurfaceViewで表示させます。


OpenCV 2.3.1 からprebuildパッケージで配布されるようになったので
サンプルコードの実行まで簡単に試せるようになっています。
以下はLinux環境でサンプルコードを実行するまでの流れです。
(確認環境はUbuntu 10.10 64bit)




1.OpenCVダウンロードと解凍

http://sourceforge.net/projects/opencvlibrary/files/opencv-android/2.3/
にある
OpenCV-2.3.1-beta1-android-bin.tar.bz2
をダウンロードして展開。

$ tar jxvf OpenCV-2.3.1-beta1-android-bin.tar.bz2


2.OpenCVサンプルコード実行

カメラ機能のついた端末へデバッグモードで繋いだ状態で
eclipseOpenCVのプロジェクトを開きます。
sampleディレクトリ内のプロジェクトを開きます。


実行。
これだけ。


ただし、tutorial-3-nativeとtutorial-4-mixedだけはndkを使っているので
eclipseで実行する前にndk-buildしてやる必要があります。

$ cd tutorial-3-native
$ ndk-build


sampleディレクトリ内には以下のようなデモと段階的なチュートリアルがあります。


デモ

15-puzzle
画面を16分割してパズルにするデモ
face-detection
顔認識デモ
image-manipulations
Canny, Sepia, Sobel, Blur, Zoomのデモ


画像はimage-manipulationsのデモ。画面中央のみCannyが効いてる。


チュートリアル

tutorial-0-androidcamera
OpenCVを使わないAndroidプログラム
tutorial-1-addopencv
OpenCV Java APIの使用方法:Cannyを追加
tutorial-2-opencvcamera
NativeCameraの使用方法:VideoCaptureでカメラキャプチャ
tutorial-3-native
NDKプログラミングする方法:NDKで特徴点検出を追加
tutorial-4-mixed
まとめ:NDKとOpenCV Java APIを連携させて使用


参考:

OpenCV 2 Computer Vision Application Programming Cookbook: Over 50 Recipes to Master This Library of Programming Functions for Real-time Computer Vision [ペーパーバック]

サンプルコードが直感的でわかりやすい。もやもやしてたところがスッキリ。



Android Hacks ―プロが教えるテクニック & ツール