opencv
OpenCV-initialisering i Android
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 ettSIGSEGV
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.