Sök…


Initialisering av Async

Att använda async-initialisering är ett rekommenderat sätt för applikationsutveckling. Den använder OpenCV Manager för att komma åt OpenCV-bibliotek externt installerade i målsystemet.

Kodavsnitt som implementerar async-initieringen:

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

    ...
}

I detta fall fungerar vår applikation med OpenCV Manager på asynkront sätt. OnManagerConnected kommer att anropas i UI-tråd när initialiseringen är klar.

Observera att det inte är tillåtet att använda OpenCV-samtal eller ladda OpenCV-beroende infödda libs innan du åberopar detta återuppringning. Ladda dina egna infödda bibliotek som är beroende av OpenCV efter den framgångsrika OpenCV-initieringen.

Standardimplementering av BaseLoaderCallback behandlar applikationskontext som Activity och kallar metoden Activity.finish() för att avsluta vid initialiseringsfel. För att åsidosätta detta beteende måste du åsidosätta metoden finish() i BaseLoaderCallback klassen och implementera din egen slutföringsmetod.

OpenCV Manager

OpenCV Manager är en Android-tjänst som är inriktad på att hantera OpenCV-biblioteksbinarier på enheter för slutanvändare. Det gör det möjligt att dela OpenCV dynamiska bibliotek mellan applikationer på samma enhet.

Chefen ger följande fördelar:

  • Mindre minnesanvändning (cirka 40 MB). Alla appar använder samma binära tjänster från tjänsten och håller inte infödda libs i sig själva.
  • Hårdvaraspecifika optimeringar för alla plattformar som stöds.
  • Trusted OpenCV-bibliotekskälla. Alla paket med OpenCV publiceras på Google Play-marknaden.
  • Regelbundna uppdateringar och bugfixar.

Den enda nackdelen är att användaren uppmanas att ladda ner och extra app, så användarupplevelsen minskar något.

Mer information: Android OpenCV Manager

Uppdaterad 18/10/16:
Det finns ett fel i OpenCV Manager-versionen som distribueras i Play Store (uppdaterad 21/09/15).
Det påverkar endast OpenCV 3.1.0-versionen. När du kör vissa OpenCV-funktioner får du ett SIGSEGV fel. Den version som distribueras med Android SDK fungerar bra ( OpenCV-android-sdk/apk/OpenCV_3.1.0_Manager_3.10_{platform}.apk ). Det kan laddas ner från OpenCV: s webbplats .
Mer info: nummer # 6247 .

Statisk initialisering

Enligt detta tillvägagångssätt inkluderas alla OpenCV-binärer i ditt applikationspaket. Den är mestadels utformad för utvecklings- och felsökningsändamål. Detta tillvägagångssätt avskrivs för produktionskoden, initialisering av async rekommenderas.

Om ditt applikationsprojekt inte har en JNI-del, kopierar du bara motsvarande OpenCV native libs från OpenCV-3.1.0-android-sdk/sdk/native/libs till din projektkatalog till mappapp app/src/main/jniLibs .

I fallet med applikationsprojektet med en JNI-del måste du istället för manuell bibliotekskopiering ändra din Android.mk fil: lägg till följande två kodrader efter "include $(CLEAR_VARS)" och innan "include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk" :

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on

Resultatet ska se ut enligt följande:

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

Efter att biblioteken OpenCV kommer att kopieras till din ansökan jniLibs mappen under JNI bygga.

Det sista steget för att aktivera OpenCV i din applikation är Java-initialiseringskod innan du ringer OpenCV API. Det kan till exempel göras i det statiska avsnittet i Aktivitetsklassen:

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

Om din ansökan inkluderar andra OpenCV-beroende ursprungliga bibliotek bör du ladda dem efter OpenCV-initialisering:

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

Obs: initDebug() avskrivs för produktionskod. Den är utformad endast för experimentella och lokala utvecklingsändamål. Om du vill publicera din app-metod med asynkinitialisering.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow