Suche…


Async-Initialisierung

Die asynchrone Initialisierung ist ein empfohlener Weg für die Anwendungsentwicklung. Es verwendet OpenCV Manager, um auf OpenCV-Bibliotheken zuzugreifen, die extern im Zielsystem installiert sind.

Code-Snippet zur Implementierung der asynchronen Initialisierung:

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 diesem Fall arbeitet unsere Anwendung asynchron mit OpenCV Manager. OnManagerConnected Callback wird im UI-Thread aufgerufen, wenn die Initialisierung abgeschlossen ist.

Bitte beachten Sie, dass es nicht erlaubt ist, OpenCV-Aufrufe zu verwenden oder OpenCV-abhängige native Bibliotheken zu laden, bevor Sie diesen Callback aufrufen. Laden Sie nach der erfolgreichen OpenCV-Initialisierung Ihre eigenen nativen Bibliotheken, die von OpenCV abhängig sind.

Die BaseLoaderCallback Standardimplementierung behandelt den Anwendungskontext als Activity und ruft die Activity.finish() Methode auf, um den Vorgang im Falle eines Initialisierungsfehlers zu beenden. Um dieses Verhalten zu überschreiben, müssen Sie die finish() Methode der BaseLoaderCallback Klasse BaseLoaderCallback und Ihre eigene Finalisierungsmethode implementieren.

OpenCV Manager

OpenCV Manager ist ein Android-Dienst zur Verwaltung von OpenCV-Bibliotheksbinärdateien auf Endbenutzergeräten. Dadurch können die dynamischen OpenCV-Bibliotheken für Anwendungen auf demselben Gerät freigegeben werden.

Der Manager bietet die folgenden Vorteile:

  • Weniger Speicherbedarf (ca. 40 MB). Alle Apps verwenden dieselben Binärdateien vom Dienst und enthalten keine nativen Bibliotheken in sich.
  • Hardwarespezifische Optimierungen für alle unterstützten Plattformen.
  • Vertrauenswürdige OpenCV-Bibliotheksquelle. Alle Pakete mit OpenCV werden auf dem Google Play-Markt veröffentlicht.
  • Regelmäßige Updates und Fehlerbehebungen.

Der einzige Nachteil besteht darin, dass der Benutzer aufgefordert wird, eine zusätzliche App herunterzuladen, sodass die Benutzererfahrung geringfügig abnimmt.

Weitere Informationen: Android OpenCV Manager

Aktualisiert am 18.10.16:
In der im Play Store verbreiteten OpenCV Manager-Version (aktualisiert am 21.09.15) ist ein Fehler aufgetreten.
Es betrifft nur die Version OpenCV 3.1.0. Wenn Sie einige OpenCV-Funktionen ausführen, wird ein SIGSEGV Fehler SIGSEGV . Die mit Android SDK vertriebene Version funktioniert 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 ). Es kann von der OpenCV-Website heruntergeladen werden .
Weitere Informationen: Ausgabe Nr. 6247 .

Statische Initialisierung

Nach diesem Ansatz sind alle OpenCV-Binärdateien in Ihrem Anwendungspaket enthalten. Es ist hauptsächlich für Entwicklungs- und Debugging-Zwecke konzipiert. Dieser Ansatz ist für den Produktionscode veraltet , eine asynchrone Initialisierung wird empfohlen.

Wenn Ihr Anwendungsprojekt keinen JNI-Part enthält, kopieren Sie einfach die entsprechenden nativen OpenCV-3.1.0-android-sdk/sdk/native/libs von OpenCV-3.1.0-android-sdk/sdk/native/libs in Ihr Projektverzeichnis in den Ordner app/src/main/jniLibs .

Im Falle eines Anwendungsprojekts mit einem JNI-Teil müssen Sie anstelle des manuellen Kopieren von Bibliotheken Ihre Android.mk Datei ändern: Android.mk nach "include $(CLEAR_VARS)" und "include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk" before "include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk" die folgenden beiden Codezeilen ein "include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk" :

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on

Das Ergebnis sollte wie folgt aussehen:

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

Danach werden die OpenCV-Bibliotheken während des JNI- jniLibs in den Ordner jniLibs Ihrer Anwendung jniLibs .

Der letzte Schritt zum Aktivieren von OpenCV in Ihrer Anwendung ist der Java-Initialisierungscode, bevor Sie die OpenCV-API aufrufen. Dies kann beispielsweise im statischen Abschnitt der Activity-Klasse erfolgen:

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

Wenn Ihre Anwendung andere OpenCV-abhängige native Bibliotheken enthält, sollten Sie diese nach der OpenCV-Initialisierung laden:

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

Hinweis: initDebug() Methode initDebug() wird für den Produktionscode nicht mehr verwendet. Es ist nur für experimentelle und lokale Entwicklungszwecke vorgesehen. Wenn Sie Ihre App-Verwendung mit asynchroner Initialisierung veröffentlichen möchten.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow