はじめに
OpenCVを普通にAndroidで使うとすると、OpenCV Managerをインストールすることになると思います、それを前提にした情報はいっぱいあるのですが、今回OpenCV Managerをユーザにインストールさせる事はNGだったため、OpenCV Manager無しで利用する方法をまとめました。
※要するにOpenCVを静的ビルドする方法です。Eclipseでのやり方でAndroidStudioはやり方が違います。
OpenCV公式にも静的ビルドする方法があるのですが、私の英語力が足りないせいか手順通りやってもうまくいきませんでした。
Android NDKを準備(既に有る方は飛ばして下さい)
Android NDK下記からダウンロードします。※今回はandroid-ndk-r10e-darwin-x86_64.binをダウンロードしました。
https://developer.android.com/ndk/downloads/index.html
同ページに記述がありますが、下記コマンドを叩いてbinを展開します、展開には数分かかります。
1 2 3 |
$ cd [android-ndk-r10e-darwin-x86_64.binのあるディレクトリ] $ chmod a+x android-ndk-r10e-darwin-x86_64.bin $ ./android-ndk-r10e-darwin-x86_64.bin |
完了するとandroid-ndk-r10eが出来上がるので、任意の場所に配置して下さい。
次にandroid-ndk-r10eの中にあるndk-buildにパスを通します。
1 2 3 4 5 6 |
bash_profileのPATHにndkのパスも追加する。 $ vim ~/.bash_profile 例) export PATH=$PATH:/path/to/android-sdk-macosx/platform-tools:/path/to/android-ndk-r10e $ source ~/.bash_profile |
OpenCV for Androidをインポート
この記事を探しに来ている方は、もうやってる気がしますが念のため。
http://opencv.org/downloads.htmlからOpenCV for Androidをダウンロードします。今回は2.4.11にしました。
解凍して、Eclipseでインポートします。色々インポートできますがOpenCV Library – 2.4.11だけでOKです。
そしたらOpenCVを使いたいプロジェクトのPropertiesを開いて、AndroidのLibraryから、Addを選んで先ほどインポートしたOpenCV Library – 2.4.11を選択します。
静的ビルド
いよいよ本題に入ります。
ここからはOpenCVを使いたいプロジェクトに対する操作になります。
・プロジェクトにjniディレクトリを作成します。
・jniディレクトリの中身にAndroid.mkファイル作ります。
・Android.mkは下記を記述します。
1 2 3 4 5 6 7 8 9 10 |
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # OpenCV OPENCV_CAMERA_MODULES:=on OPENCV_INSTALL_MODULES:=on #OPENCV_LIB_TYPE:=STATIC include /path/to/OpenCV-android-sdk-2.4.11/sdk/native/jni/OpenCV.mk |
・jniディレクトリの中身にApplication.mkファイルを作ります。
・Application.mkは下記を記述します。
1 2 3 4 5 6 |
APP_STL := gnustl_static APP_CPPFLAGS := -frtti -fexceptions # 対応するCPU、複数指定する場合は例えばこのようにする、APP_ABI := armeabi armeabi-v7a x86 # 複数指定すればするほど、対応端末は増えますが、APKの容量も増えます、OpenCVの場合は一つごとに6〜7MB増えます。 APP_ABI := armeabi-v7a APP_PLATFORM := android-9 |
・ここまで行ったら、ターミナルで対象プロジェクトまで移動してから下記を実行します。
1 |
$ ndk-build |
特にエラーにならなければ静的ビルドは成功です。プロジェクトのlibsディレクトリにarmeabi-v7aディレクトリができているかと思います。
Android側で読み込み
静的ビルドしただけでは動作しませんので、読み込むサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class MainActivity extends Activity { static { OpenCVLoader.initDebug(); } private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { Log.d(TAG, "読み込み成功!"); } break; default: { Log.d(TAG, "読み込み失敗!"); } break; } } }; @Override public void onResume() { super.onResume(); // OpenCVのサンプルだと下記になっていますが、利用しません。 // OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11, this, mLoaderCallback); mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } } |
最後に
AndroidStudioのほうが良いのですが、今回の場合Eclipseを使わなければいけなかったため、情報が少なくて大変でした、役に立てば幸いです。
もちろんOpenCV Managerを使えるなら使ったほうが、アプリの容量も下げれて良いかと思います。ただアプリを使うユーザのリテラシーが低めなら使わない方が無難でしょう。