基本的には
http://workpiles.com/2015/04/android-opencv-face_detection/
の通りですが,一部変更が必要な箇所があったので,備忘録として.
使用したOpenCVのバージョンは2.4.11
含まれているサンプルの中のface-detectionを動かすことを目標にします.
android SDK, NDK, OpenCV for android SDKはダウンロードして適当な場所に解凍しておく.
プロジェクトのインポート
File > New > Import Project で,OpenCV-android-sdk/samples/face-detection
を指定してインポート.
表示されるダイアログは特にいじらず,Next からの Finish
API14が入っていないと,その旨のメッセージが表示されるかもしれないので,その時はそのダイアログに従って必要なものをインストールする.
aidl is missing
Error:Execution failed for task ':openCVLibrary2411:compileDebugAidl'.
> aidl is missing
なるエラーが.
ビルドツールのバージョンが23.0.0 rc1に指定されているのに<android-sdk-path>\build-tools\23.0.0_rc1
以下にaidl.exeが無いのが原因.(ちなみに,<android-sdk-path>
はlocal.properties
内にsdk.dir
として設定されている)
File > Project Structure を開き,
openCVSamplefacedetection, openCVLibrary2411共に,Build Tools Versionを22.0.1に設定する.
参考:http://stackoverflow.com/questions/30506406/aidl-is-missing-android-studio
エンコーディング
ファイルのエンコードがWindows31で良いのかとか言われたりするので,
File > Settings を開き,
Editor > File Encodings で IDE Encoding, Project Encoding 共に UTF-8に設定.
NDKの設定
この段階で一旦ビルドしてみると,
Error:Execution failed for task ':openCVSamplefacedetection:compileDebugNdk'.
> NDK not configured.
Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties.
(On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk)
とか言われる.
上記リンク先にもあるように,
local.properties
に
ndk.dir=C\:\\Users\\hoge\\android-ndk-r10e
を追加.(環境によって変わる.NDKを置いた場所を指定する.)
Windows環境なので区切り文字がバックスラッシュ&エスケープが必要なのに注意.
build.gradle設定
openCVSamplefacedetectionモジュールのbuild.gradleもいじる.
android {
...
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'src\\main\\libs'
}
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
def ndkDir = "C:\\Users\\hoge\\android-ndk-r10e"
commandLine "$ndkDir\\ndk-build.cmd",
'-C', file('src\\main\\jni').absolutePath,
'-j', Runtime.runtime.availableProcessors(),
'all',
'NDK_DEBUG=1'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn buildNative
}
}
これまたリンク先と違い,ディレクトリ区切りがバックスラッシュなのに注意.
ndk-build
コマンドも,ndk-build.cmd
に変えてある.
sourceSets.main
以下の記述もちょっと変えてある.( http://stackoverflow.com/questions/21096819/jni-and-gradle-in-android-studio )
複数の環境に対応させるには
同じbuild.gradleでwindows環境にもlinux環境にも対応させたい.
http://qiita.com/abekatsu/items/31459d11284623277668#buildgradle
こうすればよいのか.
Android.mk
face-detection\openCVSamplefacedetection\src\main\jni\Android.mk
を書き換え.
include ../../sdk/native/jni/OpenCV.mk
を絶対パスに変える.
例えば
include C:\Users\hoge\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk
とか.
Application.mk
以上の状態でビルドすると,ビルドは通る(Build > Make Project).
しかし,実行してみる(Run > Run 'openCVSamplefacedetection`して,エミュレータや実機に転送)と,
端末には"Unfortunately, OCV Face Detection has stopped"と表示されてアプリが停止し,
logcatには
05-31 19:07:07.437 29773-29773/org.opencv.samples.facedetect E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: Couldn't load detection_based_tracker: findLibrary returned null
的なエラーが.
正しいターゲットを指定できておらず,ライブラリを読み込めていない(?)っぽい.
face-detection\openCVSamplefacedetection\src\main\jni\Application.mk
を修正する.
APP_ABI := armeabi armeabi-v7a mips x86
( 参考:http://answers.opencv.org/question/4222/problem-working-with-native-apps/ )
これでもう一度ビルド→実行.
動いた!