AndroidStudioでOpenCVのサンプルを動かす


Pocket

画像処理で超有名なOpenCVをAndroidStudioで試してみようとしたら、結構ハマったのでメモ。
OpenCVをダウンロードして来て、サンプルのface-detectionを動かすとろこまでです。

<環境>
・Ubuntu 14.04
・AndroidStudio 1.10
・AndroidNKD r10d
・OpenCV 2.4.10

 
実行画面です。顔の位置に緑枠が表示されます。
Face Detection

 

OpenCVをAndroidStudioにインポート

まずはOpenCVをダウンロードしてきて、AndroidStudioにインポートします。

やり方は下記サイトを参考にしました。
<参考>
Android StudioでOpenCV for Androidを使用する

あと、Android NDKも使用するので、インストールがまだなら合わせてインストールしておきます。

 

face-detectionのインポート

OpenCVのインポートが終わったら、次にサンプルプロジェクトをインポートします。
これ↓
OpenCV-2.4.10-android-sdk/samples/face-detection

インポートが終わったら、まずはじめに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を使用しない方法は非推奨らしいですが

<参照>
http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html#application-development-with-static-initialization

やり方は、
・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が使える環境を作ることができました。
これからいろいろ使ってみたいと思います。

 

 

Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です