スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Android】NDK から OpenCV を使うプロジェクトを作る手順

久しぶりにAndroidでOpenCVを使おうとしたら
書き始めるまでに必要な準備を忘れていたのでメモ。
コメントを書き入れている部分は
「ここにかかなければいけない、というわけではないけど
ここに書いておくのが便利」という部分です

環境 Eclipse 3.7.2

・「プロパティ」→「Android」からOpenCVのライブラリを登録

・OpenCVを使うActivityのメンバに以下を追加し
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
//ここで後で自分で作成するC/C++でopencvを動かすライブラリをロードしておく
System.loadLibrary("my_opencv_method");
//ロードが成功した場合にのみボタンを有効にする
mButton.setEnabled(true);
break;
default:
super.onManagerConnected(status);
break;
}
}
};
onResumeを以下のようにオーバーライド
@Override
public void onResume()
{
super.onResume();
//ボタンはロード成功するまでは無効化しておく
mButton1.setEnabled(false);
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
}

・プロジェクトを右クリック→「Android ツール」→「Add native support」

・プロジェクトを右クリック→「プロパティ」→「C/C++一般」→「パスおよびシンボル」→「インクルード」タブ→「追加」ボタン
で最低でも以下の3つを登録
/opt/OpenCV-2.4.6-android-sdk/sdk/native/jni/include
/opt/android-ndk-r9/sources/cxx-stl/gnu-libstdc++/4.6/include
/opt/android-ndk-r9/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include
(僕は/optに各ライブラリを置いているのでそのへんは適宜修正)

・jniフォルダを作成して、Android.mkとApplication.mkを用意
(他のプロジェクトからコピペして編集)
Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#OPENCV_CAMERA_MODULES:=off
#OPENCV_INSTALL_MODULES:=off
#OPENCV_LIB_TYPE:=SHARED
include /opt/OpenCV-2.4.6-android-sdk/sdk/native/jni/OpenCV.mk

LOCAL_SRC_FILES := my_opencv_method.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS += -llog -ldl

LOCAL_MODULE := my_opencv_method

include $(BUILD_SHARED_LIBRARY)

Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-8

・Activityにnativeメソッドを記載

public static native void threshold(long matAddr);
public static native int[] findContours(long matAddr);

・プロジェクトのAndroidManifest.xmlなどが保存してあるディレクトリに移動し以下のコマンドを実行
javah -classpath src -o jni/my_opencv_method.h {package name}.MainActivity
jniにmy_opencv_method.hが生成される

・my_opencv_method.hからメソッドをコピー
JNIEXPORT void JNICALL Java_com_fc2_blog_zaburoapp_markerdetection_MainActivity_threshold (JNIEnv *, jclass, jlong);


・my_opencv_method.cppを作成してペーストし、以下のincludeを加える
#include <jni.h>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <android/log.h>
#include <my_opencv_method.h>
このへんがあれば十分
(JNIEnv *, jclass, jlong)→(JNIEnv * jenv, jclass, jlong matAddr)みたいな感じで
変数名を指定するのを忘れずに。

・コードを書いて実行
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。