画像処理で超有名なOpenCVをAndroidStudioで試してみようとしたら、結構ハマったのでメモ。
OpenCVをダウンロードして来て、サンプルのface-detectionを動かすとろこまでです。
<環境>
・Ubuntu 14.04
・AndroidStudio 1.10
・AndroidNKD r10d
・OpenCV 2.4.10
OpenCVをAndroidStudioにインポート
まずはOpenCVをダウンロードしてきて、AndroidStudioにインポートします。
やり方は下記サイトを参考にしました。
<参考>
Android StudioでOpenCV for Androidを使用する
あと、Android NDKも使用するので、インストールがまだなら合わせてインストールしておきます。
face-detectionのインポート
OpenCVのインポートが終わったら、次にサンプルプロジェクトをインポートします。
これ↓
インポートが終わったら、まずはじめにlocal.propertiesファイルにNDKのパスを設定します。
sdk.dir=/home/hoge/Android/Sdk ndk.dir=/home/hoge/android-ndk-r10d ←これを追加
それでは早速ビルドして動かしてみよう…と思ったらビルドエラーが…
fatal error: opencv2/core/core.hpp: No such file or directory #include <opencv2/core/core.hpp>
なぜかDetectionBasedTracker_jni.cppでインクルードしているヘッダが見つからない…。
どうやらAndroidStudioでのビルドだとAndroid.mkの設定が反映されないようです。
ということで、ビルド時にndk_buildを実行するタスクをbuild.gradleに追加します。
<参考>
http://stackoverflow.com/questions/21096819/jni-and-gradle-in-android-studio
android{ ・・・ sourceSets.main.jni.srcDirs = [] task buildNative(type: Exec, description: 'Compile JNI source via NDK') { def ndkDir = "/home/hoge/android-ndk-r10d" commandLine "$ndkDir/ndk-build", '-C', file('src/main/jni').absolutePath, '-j', Runtime.runtime.availableProcessors(), 'all' } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn buildNative } }
3行目:jniフォルダの指定を空にすることで、自動的にビルドされないようにします。
次にAndroid.mk内のOpenCV.mkのパスを相対パスから絶対パスに修正。
include ../../sdk/native/jni/OpenCV.mk ←これを絶対パスに変更
これでビルドが通るようになったと思います。
ビルドが完了するとmain/libs/armeabi-v7aにlibdetection_based_tracker.soができているので、フォルダ名をlibsからjniLibsに変更しておきます。
※build.gradleでjniLibsフォルダ名をlibsに変更してもOKです
※<参考>http://stackoverflow.com/questions/21096819/jni-and-gradle-in-android-studio
これで実行できるようになります。
実行すると初めにOpenCV managerをインストールするためのダイアログが表示されます。
managerをインストールしないとアプリが終了してしまいます。
OpenCV Managerなしで実行できるようにする
ライブラリをapkに含めることでmanagerなしでも実行可能です。
※managerを使用しない方法は非推奨らしいですが
やり方は、
・OpenCV-2.4.10-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_java.soを
プロジェクトのjniLibsフォルダにコピー。
・FdActivity.javaを下記の通り修正。
public class FdActivity extends Activity implements CvCameraViewListener2 { static { if (!OpenCVLoader.initDebug()) { Log.d("TAG", "Filed OpenCVLoader.initDebug()"); } } ・・・ public void onResume() { super.onResume(); //OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback); mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } }
あとがき
ひとまずOpenCVが使える環境を作ることができました。
これからいろいろ使ってみたいと思います。