AndroidStudio2.0でOpenCV3.1(sample with NDK編)
移転のお知らせ
ブログはこちらに移転しました。現在はこちらで更新しています。
前回はOpenCV for Androidをダウンロードし、NDKの要らないサンプルをビルドしました。
今回はNDKの必要なサンプルをビルドしてみます。
1.サンプルをインポートする
前回と同じ手順でサンプルプログラム「face-detection」をインポートします。
2.設定の変更
インポートするとこのようにエラーが発生します。エラーの青文字部分をクリックするとIDEが適切な設定をしてエラーを解決してくれます。次に、このサンプルも前回と同じようにcompileSdkVersionとminSdkVersionを変更しなければなりません。前回の記事を参考に変更してください。
3.NDKの設定
NDKの設定をします。まず、local.propertiesを編集します。ndk.dirで始まる行がなければ以下の例のようにndkのディレクトリの位置をndk.dir=につづいて入力してください。
ndk.dir=C:\Users\userSdk\ndk
私の環境ではこのndk.dirの行はインポート時にIDE側が勝手に追加してくれていました。次にbuild.gradleを編集します。
このようになっているのを
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "org.opencv.samples.facedetect"
minSdkVersion 21
targetSdkVersion 21
ndk {
moduleName "detection_based_tracker"
}
}
sourceSets.main {
jni.srcDirs = [] // This prevents the auto generation of Android.mk
jniLibs.srcDir 'src/main/libs' // This is not necessary unless you have precompiled libraries in your project.
}
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
def ndkDir = "C:/Users/user/Sdk/ndk"
commandLine "$ndkDir/ndk-build.cmd",
'-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
'-j', Runtime.runtime.availableProcessors(),
'all',
'NDK_DEBUG=1'
}
task cleanNative(type: Exec, description: 'Clean JNI object files') {
def ndkDir = "C:/Users/user/Sdk/ndk"
commandLine "$ndkDir/ndk-build.cmd",
'-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
'clean'
}
clean.dependsOn 'cleanNative'
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn buildNative
}
}
dependencies {
compile project(':openCVLibrary310')
}
このように変更します。変更点はdefaultConfig{}より下の部分で、その部分をコピペし、ndkDirを自分の環境でのndkのディレクトリの位置に差し替えます。次にAndroid.mkを編集します。
15行、inclueで始まる行にはOpenCV.mkのディレクトリが相対パスで入力されています。これを絶対パスに書き換えます。
私の環境ではこのようになりました。
4.ビルド&実行
これでビルドができる状態になりました。ビルドして実行してみてください。画面にカメラの映像が写れば成功です。それを顔に向けると顔を認識して認識した顔を矩形で囲む…はずなんですが、それが一応正しい動作なんですがどうやらOpenCV3.1 for Androidではバグで学習済み分類器のロードに失敗するようで顔認識は出来ません。どうしてもこのサンプルのような顔認識や、他にもカスケード分類器を利用した物体認識をさせたいという方はOpenCV2.4.11を使用するべきだそうです。個人的にはロードが出来ないのならコード内に分類器の文字列を埋め込んじゃえば解決できそうだなぁとは思いますが。後味は悪いですが、とりあえず今回はこれで終了です、お疲れ様でした。次回は自作のプログラムにOpenCVを組み込む手順を紹介します。
参考
AndroidStudioでOpenCVのサンプルを動かす | Workpiles
JNI and Gradle in Android Studio - Stack Overflow
java - Unable to load classifier in OpenCV for Android - Stack Overflow