opencv
OpenCV-Initialisierung in Android
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 einSIGSEGV
FehlerSIGSEGV
. Die mit Android SDK vertriebene Version funktioniertOpenCV-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()
MethodeinitDebug()
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.