opencv
AndroidでのOpenCVの初期化
サーチ…
非同期初期化
アプリケーション開発には、非同期初期化を使用することをお勧めします。 OpenCV Managerを使用して、ターゲットシステムに外部的にインストールされたOpenCVライブラリにアクセスします。
非同期初期化を実装するコードスニペット:
public class MainActivity extends Activity implements CvCameraViewListener2 {
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch(status) {
case LoaderCallbackInterface.SUCCESS:
Log.i(TAG,"OpenCV Manager Connected");
//from now onwards, you can use OpenCV API
Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
break;
case LoaderCallbackInterface.INIT_FAILED:
Log.i(TAG,"Init Failed");
break;
case LoaderCallbackInterface.INSTALL_CANCELED:
Log.i(TAG,"Install Cancelled");
break;
case LoaderCallbackInterface.INCOMPATIBLE_MANAGER_VERSION:
Log.i(TAG,"Incompatible Version");
break;
case LoaderCallbackInterface.MARKET_ERROR:
Log.i(TAG,"Market Error");
break;
default:
Log.i(TAG,"OpenCV Manager Install");
super.onManagerConnected(status);
break;
}
}
};
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
}
...
}
この場合、アプリケーションはOpenCV Managerと非同期で動作します。初期化がOnManagerConnected
すると、 OnManagerConnected
コールバックがUIスレッドで呼び出されます。
このコールバックを呼び出す前に、OpenCV呼び出しを使用したり、OpenCV依存のネイティブライブラリを読み込んだりすることはできません。 OpenCVの初期化が成功した後、OpenCVに依存する独自のネイティブライブラリをロードします。
デフォルトのBaseLoaderCallback
実装は、アプリケーションコンテキストをActivity
として扱い、初期化が失敗した場合に終了するActivity.finish()
メソッドを呼び出します。この動作をオーバーライドするには、 BaseLoaderCallback
クラスのfinish()
メソッドをオーバーライドし、独自のファイナライズメソッドを実装する必要があります。
OpenCVマネージャ
OpenCV Managerは、エンドユーザデバイス上のOpenCVライブラリのバイナリを管理するためのAndroidサービスです。同じデバイス上のアプリケーション間でOpenCVダイナミックライブラリを共有することができます。
マネージャーには次の利点があります。
- 少ないメモリ使用量(約40MB)。すべてのアプリはサービスの同じバイナリを使用し、ネイティブライブラリを内部に保持しません。
- サポートされているすべてのプラットフォームのハードウェア固有の最適化。
- 信頼できるOpenCVライブラリソース。 OpenCVのパッケージはすべてGoogle Playマーケットに公開されています。
- 定期的なアップデートとバグ修正。
唯一の欠点は、ユーザーにダウンロードと余分なアプリケーションのプロンプトが表示されるため、ユーザーエクスペリエンスがわずかに低下することです。
詳細情報: Android OpenCV Manager
18/10/16更新:
Playストアに配布されたOpenCV Managerバージョンにバグがあります(21/09/15更新)。
それはOpenCV 3.1.0のバージョンにのみ影響します。いくつかのOpenCV関数を実行すると、SIGSEGV
エラーが発生します。 Android SDKで配布されているバージョンは正常に動作します(OpenCV-android-sdk/apk/OpenCV_3.1.0_Manager_3.10_{platform}.apk
)。 OpenCVのWebサイトからダウンロードできます。
詳細情報: 問題#6247 。
静的初期化
このアプローチによると、すべてのOpenCVバイナリがアプリケーションパッケージに含まれています。これは主に開発とデバッグの目的で設計されています。この方法はプロダクションコードでは非推奨です。非同期初期化をお勧めします。
アプリケーションプロジェクトにJNIの部分がない場合は、 OpenCV-3.1.0-android-sdk/sdk/native/libs
の対応するOpenCVネイティブライブラリをプロジェクトディレクトリのapp/src/main/jniLibs
フォルダにapp/src/main/jniLibs
。
手動ライブラリのコピーではなく、JNIパートを持つアプリケーションプロジェクトの場合は、 Android.mk
ファイルを変更する必要があります。 "include $(CLEAR_VARS)"
後に"include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk"
:
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
結果は次のようになります。
include $(CLEAR_VARS)
# OpenCV
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include ../../sdk/native/jni/OpenCV.mk
その後、OpenCVライブラリは、JNIビルド中にアプリケーションのjniLibs
フォルダにコピーされます。
アプリケーションでOpenCVを有効にする最後のステップは、OpenCV APIを呼び出す前にJava初期化コードです。これは、たとえば、Activityクラスの静的セクションで行うことができます。
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error
}
}
アプリケーションに他のOpenCV対応ネイティブライブラリが含まれている場合は、OpenCV初期化後にそれらをロードする必要があります。
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error
} else {
System.loadLibrary("my_jni_lib1");
System.loadLibrary("my_jni_lib2");
}
}
注:
initDebug()
メソッドは、実動コードでは非推奨です。これは、実験的および地方開発のためだけに設計されています。アプリを公開するには、非同期初期化を使用します。