非同步初始化

使用非同步初始化是應用程式開發的推薦方法。它使用 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 一起使用。初始化完成後,將在 UI 執行緒中呼叫 OnManagerConnected 回撥。

請注意,在呼叫此回撥之前,不允許使用 OpenCV 呼叫或載入依賴於 OpenCV 的本機庫。在 OpenCV 初始化成功後,載入你自己的依賴 OpenCV 的本機庫。

預設的 BaseLoaderCallback 實現將應用程式上下文視為 Activity,並在初始化失敗時呼叫 Activity.finish() 方法退出。要覆蓋此行為,你需要覆蓋 BaseLoaderCallback 類的 finish() 方法並實現自己的終結方法。

OpenCV 經理

OpenCV Manager 是一項 Android 服務,旨在管理終端使用者裝置上的 OpenCV 庫二進位制檔案。它允許在同一裝置上的應用程式之間共享 OpenCV 動態庫。

經理提供以下好處:

  • 記憶體使用量減少(約 40MB)。所有應用程式都使用來自服務的相同二進位制檔案,並且不會將本機庫保留在自身內部。
  • 針對所有受支援平臺的硬體特定優化。
  • 受信任的 OpenCV 庫源。所有包含 OpenCV 的軟體包都在 Google Play 市場上釋出。
  • 定期更新和錯誤修復。

唯一的缺點是提示使用者下載和額外的應用程式,因此使用者體驗略有下降。

更多資訊: Android OpenCV Manager

更新於 2016 年 10 月 18 日:
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 網站下載。
更多資訊: 問題#6247