サーチ…


非同期初期化

アプリケーション開発には、非同期初期化を使用することをお勧めします。 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()メソッドは、実動コードでは非推奨です。これは、実験的および地方開発のためだけに設計されています。アプリを公開するには、非同期初期化を使用します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow