Zoeken…


Async-initialisatie

Async-initialisatie gebruiken is een aanbevolen manier voor het ontwikkelen van toepassingen. Het maakt gebruik van OpenCV Manager voor toegang tot OpenCV-bibliotheken die extern in het doelsysteem zijn geïnstalleerd.

Codefragment dat de asynchronisatie-initialisatie implementeert:

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

    ...
}

In dit geval werkt onze applicatie asynchroon met OpenCV Manager. OnManagerConnected callback wordt in UI-thread opgeroepen wanneer de initialisatie is voltooid.

Houd er rekening mee dat het niet is toegestaan OpenCV-aanroepen te gebruiken of OpenCV-afhankelijke native bibliotheken te laden voordat deze callback wordt aangeroepen. Laad uw eigen native bibliotheken die afhankelijk zijn van OpenCV na de succesvolle OpenCV-initialisatie.

Standaard BaseLoaderCallback implementatie behandelt toepassingscontext als Activity en roept de methode Activity.finish() aan om af te sluiten in geval van initialisatiefout. Om dit gedrag te onderdrukken, moet u de methode finish() van de BaseLoaderCallback klasse BaseLoaderCallback en uw eigen methode voor voltooiing implementeren.

OpenCV Manager

OpenCV Manager is een Android-service die is gericht op het beheren van binaire bestanden van OpenCV-bibliotheken op apparaten van eindgebruikers. Hiermee kunt u de OpenCV dynamische bibliotheken delen tussen applicaties op hetzelfde apparaat.

De manager biedt de volgende voordelen:

  • Minder geheugengebruik (ongeveer 40 MB). Alle apps gebruiken dezelfde binaries van service en houden native bibliotheken niet in zichzelf.
  • Hardware-specifieke optimalisaties voor alle ondersteunde platforms.
  • Vertrouwde OpenCV-bibliotheekbron. Alle pakketten met OpenCV worden gepubliceerd op Google Play Market.
  • Regelmatige updates en bugfixes.

Het enige nadeel is dat de gebruiker wordt gevraagd om te downloaden en een extra app, zodat de gebruikerservaring enigszins afneemt.

Meer info: Android OpenCV Manager

Bijgewerkt 18/10/16:
Er is een bug in de OpenCV Manager-versie die wordt gedistribueerd in de Play Store (bijgewerkt op 21-09-15).
Het heeft alleen invloed op de OpenCV 3.1.0-versie. Wanneer u enkele OpenCV-functies uitvoert, krijgt u een SIGSEGV fout. De versie die wordt gedistribueerd met Android SDK werkt prima ( OpenCV-android-sdk/apk/OpenCV_3.1.0_Manager_3.10_{platform}.apk ). Het kan worden gedownload van de OpenCV-website .
Meer info: uitgave # 6247 .

Statische initialisatie

Volgens deze benadering zijn alle OpenCV-binaire bestanden opgenomen in uw toepassingspakket. Het is meestal ontworpen voor ontwikkelings- en foutopsporingsdoeleinden. Deze benadering is verouderd voor de productiecode. Async-initialisatie wordt aanbevolen.

Als uw applicatieproject geen JNI-onderdeel heeft, kopieert u gewoon de bijbehorende OpenCV native libs van OpenCV-3.1.0-android-sdk/sdk/native/libs naar uw projectmap naar map app/src/main/jniLibs .

In het geval van het applicatieproject met een JNI-deel, moet u in plaats van het handmatig kopiëren van bibliotheken uw Android.mk bestand wijzigen: voeg de volgende twee coderegels toe na "include $(CLEAR_VARS)" en daarvoor "include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk" :

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on

Het resultaat zou er als volgt uit moeten zien:

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

Daarna worden de OpenCV-bibliotheken gekopieerd naar de map jniLibs van uw toepassing tijdens de JNI-build.

De laatste stap van het inschakelen van OpenCV in uw toepassing is de Java-initialisatiecode voordat de OpenCV API wordt aangeroepen. Dit kan bijvoorbeeld in het statische gedeelte van de klasse Activiteit:

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

Als uw toepassing andere OpenCV-afhankelijke native bibliotheken bevat, moet u deze laden na OpenCV-initialisatie:

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

Opmerking: methode initDebug() is verouderd voor productiecode. Het is alleen ontworpen voor experimentele en lokale ontwikkelingsdoeleinden. Als u uw app-gebruik wilt publiceren met async-initialisatie.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow