Ricerca…


Inizializzazione asincrona

L'utilizzo dell'inizializzazione async è un metodo consigliato per lo sviluppo di applicazioni. Utilizza OpenCV Manager per accedere alle librerie OpenCV installate esternamente nel sistema di destinazione.

Snippet di codice che implementa l'inizializzazione async:

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 questo caso, la nostra applicazione funziona con OpenCV Manager in modo asincrono. OnManagerConnected callback OnManagerConnected verrà chiamato nel thread dell'interfaccia utente, al termine dell'inizializzazione.

Si noti che non è consentito utilizzare chiamate OpenCV o caricare librerie native dipendenti da OpenCV prima di richiamare questo callback. Carica le tue librerie native che dipendono da OpenCV dopo l'inizializzazione di OpenCV.

BaseLoaderCallback implementazione di BaseLoaderCallback predefinita considera il contesto dell'applicazione come Activity e chiama il metodo Activity.finish() per uscire in caso di errore di inizializzazione. Per sovrascrivere questo comportamento è necessario sovrascrivere il metodo finish() della classe BaseLoaderCallback e implementare il proprio metodo di finalizzazione.

OpenCV Manager

OpenCV Manager è un servizio Android destinato a gestire i binari delle librerie OpenCV sui dispositivi degli utenti finali. Permette di condividere le librerie dinamiche OpenCV tra le applicazioni sullo stesso dispositivo.

Il Manager offre i seguenti vantaggi:

  • Meno utilizzo della memoria (circa 40 MB). Tutte le app utilizzano gli stessi binari dal servizio e non mantengono le librerie native dentro se stesse.
  • Ottimizzazioni specifiche dell'hardware per tutte le piattaforme supportate.
  • Fonte di libreria Trusted OpenCV. Tutti i pacchetti con OpenCV sono pubblicati sul mercato di Google Play.
  • Aggiornamenti regolari e correzioni di bug.

L'unico svantaggio è che all'utente viene richiesto di scaricare e un'app aggiuntiva, quindi l'esperienza dell'utente diminuisce leggermente.

Ulteriori informazioni: Android OpenCV Manager

Aggiornato il 18/10/16:
C'è un bug nella versione di OpenCV Manager distribuita su Play Store (aggiornato il 21/09/15).
Colpisce solo la versione di OpenCV 3.1.0. Quando si eseguono alcune funzioni OpenCV si ottiene un errore SIGSEGV . La versione distribuita con Android SDK funziona OpenCV-android-sdk/apk/OpenCV_3.1.0_Manager_3.10_{platform}.apk ( OpenCV-android-sdk/apk/OpenCV_3.1.0_Manager_3.10_{platform}.apk ). Può essere scaricato dal sito Web di OpenCV .
Ulteriori informazioni: numero 6247 .

Inizializzazione statica

Secondo questo approccio tutti i binari OpenCV sono inclusi nel pacchetto dell'applicazione. È progettato principalmente per scopi di sviluppo e di debug. Questo approccio è deprecato per il codice di produzione, si consiglia l'inizializzazione async.

Se il progetto dell'applicazione non ha una parte JNI, copia le librerie native OpenCV corrispondenti da OpenCV-3.1.0-android-sdk/sdk/native/libs alla directory del progetto nella cartella app/src/main/jniLibs .

Nel caso del progetto dell'applicazione con una parte JNI, invece della copia manuale delle librerie è necessario modificare il file Android.mk : aggiungere le seguenti due righe di codice dopo "include $(CLEAR_VARS)" e prima "include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk" :

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on

Il risultato dovrebbe essere simile al seguente:

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

Successivamente le librerie OpenCV verranno copiate nella cartella jniLibs dell'applicazione durante la compilazione JNI.

L'ultimo passaggio per abilitare OpenCV nella tua applicazione è il codice di inizializzazione Java prima di chiamare OpenCV API. Può essere fatto, per esempio, nella sezione statica della classe di attività:

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

Se l'applicazione include altre librerie native dipendenti da OpenCV, è necessario caricarle dopo l'inizializzazione di OpenCV:

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

Nota: il metodo initDebug() è deprecato per il codice di produzione. È progettato solo per scopi di sviluppo sperimentale e locale. Se vuoi pubblicare la tua app usa l'approccio con l'inizializzazione asincrona.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow