画像処理で超有名な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が使える環境を作ることができました。
これからいろいろ使ってみたいと思います。





