opencv
OpenCV-initialisatie in Android
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 eenSIGSEGV
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.