Szukaj…


Inicjalizacja asynchroniczna

Korzystanie z inicjowania asynchronicznego jest zalecanym sposobem tworzenia aplikacji. Korzysta z OpenCV Managera, aby uzyskać dostęp do bibliotek OpenCV zainstalowanych zewnętrznie w systemie docelowym.

Fragment kodu implementujący inicjalizację asynchroniczną:

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);
    }

    ...
}

W takim przypadku nasza aplikacja działa w trybie asynchronicznym z Menedżerem OpenCV. OnManagerConnected zwrotne OnManagerConnected będzie wywoływane w wątku interfejsu użytkownika po zakończeniu inicjalizacji.

Należy pamiętać, że nie można używać wywołań OpenCV ani ładować natywnych bibliotek DLL zależnych od OpenCV przed wywołaniem tego wywołania zwrotnego. Załaduj własne biblioteki rodzime, które zależą od OpenCV po pomyślnej inicjalizacji OpenCV.

Domyślna implementacja BaseLoaderCallback traktuje kontekst aplikacji jako Activity i wywołuje metodę Activity.finish() celu wyjścia w przypadku niepowodzenia inicjalizacji. Aby zastąpić to zachowanie, musisz zastąpić metodę finish() klasy BaseLoaderCallback i zaimplementować własną metodę finalizacji.

Menedżer OpenCV

OpenCV Manager to usługa systemu Android ukierunkowana na zarządzanie plikami binarnymi biblioteki OpenCV na urządzeniach użytkowników końcowych. Umożliwia współdzielenie bibliotek dynamicznych OpenCV między aplikacjami na tym samym urządzeniu.

Menedżer zapewnia następujące korzyści:

  • Mniejsze zużycie pamięci (około 40 MB). Wszystkie aplikacje używają tych samych plików binarnych z serwisu i nie przechowują natywnych bibliotek w sobie.
  • Optymalizacje sprzętowe dla wszystkich obsługiwanych platform.
  • Zaufane źródło biblioteki OpenCV. Wszystkie pakiety z OpenCV są publikowane na rynku Google Play.
  • Regularne aktualizacje i poprawki błędów.

Jedyną wadą jest to, że użytkownik jest monitowany o pobranie i dodatkową aplikację, więc wrażenia użytkownika nieznacznie się zmniejszają.

Więcej informacji: Android OpenCV Manager

Zaktualizowano 18/10/16:
W wersji OpenCV Manager występuje błąd rozpowszechniany w Sklepie Play (zaktualizowany 21/09/15).
Wpływa tylko na wersję OpenCV 3.1.0. Po uruchomieniu niektórych funkcji OpenCV pojawia się błąd SIGSEGV . Wersja dystrybuowana z Android SDK działa dobrze ( OpenCV-android-sdk/apk/OpenCV_3.1.0_Manager_3.10_{platform}.apk ). Można go pobrać ze strony OpenCV .
Więcej informacji: numer 6247 .

Inicjalizacja statyczna

Zgodnie z tym podejściem wszystkie pliki binarne OpenCV są zawarte w pakiecie aplikacji. Jest przeznaczony głównie do celów programistycznych i debugowania. To podejście jest przestarzałe w przypadku kodu produkcyjnego, zaleca się inicjowanie asynchroniczne.

Jeśli twój projekt aplikacji nie ma części JNI, po prostu skopiuj odpowiednie natywne biblioteki OpenCV-3.1.0-android-sdk/sdk/native/libs z OpenCV-3.1.0-android-sdk/sdk/native/libs do katalogu projektu do folderu app/src/main/jniLibs .

W przypadku projektu aplikacji z częścią JNI zamiast ręcznego kopiowania bibliotek należy zmodyfikować plik Android.mk : dodać następujące dwie linie kodu po "include $(CLEAR_VARS)" i przed "include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk" :

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on

Wynik powinien wyglądać następująco:

include $(CLEAR_VARS)
# OpenCV
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include ../../sdk/native/jni/OpenCV.mk

Następnie biblioteki OpenCV zostaną skopiowane do folderu jniLibs aplikacji podczas kompilacji JNI.

Ostatnim krokiem włączenia OpenCV w aplikacji jest kod inicjujący Java przed wywołaniem API OpenCV. Można to zrobić na przykład w sekcji statycznej klasy Activity:

static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error
    }
}

Jeśli aplikacja zawiera inne biblioteki macierzyste zależne od OpenCV, należy je załadować po inicjalizacji OpenCV:

static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error
    } else {
        System.loadLibrary("my_jni_lib1");
        System.loadLibrary("my_jni_lib2");
    }
}

Uwaga: initDebug() jest przestarzała dla kodu produkcyjnego. Jest przeznaczony wyłącznie do eksperymentalnych i lokalnych celów rozwojowych. Jeśli chcesz opublikować aplikację, skorzystaj z metody inicjalizacji asynchronicznej.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow