opencv
Initialisation OpenCV sous Android
Recherche…
Initialisation asynchrone
L'initialisation asynchrone est une méthode recommandée pour le développement d'applications. Il utilise OpenCV Manager pour accéder aux bibliothèques OpenCV installées en externe dans le système cible.
Extrait de code implémentant l'initialisation asynchrone:
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);
}
...
}
Dans ce cas, notre application fonctionne avec OpenCV Manager de manière asynchrone. OnManagerConnected
rappel OnManagerConnected
sera appelé dans le thread d'interface utilisateur lorsque l'initialisation sera terminée.
Veuillez noter qu'il est interdit d'utiliser des appels OpenCV ou de charger des libs natives dépendantes d'OpenCV avant d'appeler ce rappel. Chargez vos propres bibliothèques natives qui dépendent d'OpenCV après l'initialisation réussie d'OpenCV.
Par défaut BaseLoaderCallback
mise en œuvre gâterie contexte d'application comme Activity
et demande Activity.finish()
méthode de sortie en cas d'échec d'initialisation. Pour remplacer ce comportement, vous devez remplacer la méthode finish()
de la classe BaseLoaderCallback
et implémenter votre propre méthode de finalisation.
OpenCV Manager
OpenCV Manager est un service Android destiné à gérer les fichiers binaires de bibliothèque OpenCV sur les périphériques des utilisateurs finaux. Il permet de partager les bibliothèques dynamiques OpenCV entre les applications sur le même périphérique.
Le gestionnaire offre les avantages suivants:
- Moins d’utilisation de la mémoire (environ 40 Mo). Toutes les applications utilisent les mêmes fichiers binaires du service et ne conservent pas les bibliothèques natives à l'intérieur.
- Optimisations spécifiques au matériel pour toutes les plates-formes prises en charge.
- Source de bibliothèque OpenCV fiable. Tous les packages avec OpenCV sont publiés sur le marché Google Play.
- Mises à jour régulières et corrections de bugs.
Le seul inconvénient est que l'utilisateur est invité à télécharger et à appliquer une application supplémentaire, ce qui réduit légèrement l'expérience utilisateur.
Plus d'infos: Android OpenCV Manager
Mis à jour 18/10/16:
Il y a un bogue dans la version d'OpenCV Manager distribuée sur Play Store (mise à jour le 21/09/15).
Cela n'affecte que la version OpenCV 3.1.0. Lorsque vous exécutez certaines fonctions OpenCV, vous obtenez une erreurSIGSEGV
. La version distribuée avec Android SDK fonctionneOpenCV-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
). Il peut être téléchargé à partir du site Web OpenCV .
Plus d'infos: Numéro 6247 .
Initialisation statique
Selon cette approche, tous les fichiers binaires OpenCV sont inclus dans votre package d'application. Il est conçu principalement à des fins de développement et de débogage. Cette approche est déconseillée pour le code de production, l'initialisation asynchrone est recommandée.
Si votre projet d'application ne comporte pas de partie JNI, copiez simplement les librairies natives OpenCV correspondantes d' OpenCV-3.1.0-android-sdk/sdk/native/libs
dans le répertoire de votre projet dans le dossier app/src/main/jniLibs
.
Dans le cas du projet d'application avec une partie JNI, au lieu de copier manuellement des bibliothèques, vous devez modifier votre fichier Android.mk
: ajoutez les deux lignes de code suivantes après "include $(CLEAR_VARS)"
et avant "include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk"
:
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
Le résultat devrait ressembler à ceci:
include $(CLEAR_VARS)
# OpenCV
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include ../../sdk/native/jni/OpenCV.mk
Après cela, les bibliothèques OpenCV seront copiées dans le dossier jniLibs
de votre application lors de la construction de JNI.
La dernière étape de l'activation d'OpenCV dans votre application est le code d'initialisation Java avant d'appeler l'API OpenCV. Cela peut être fait, par exemple, dans la section statique de la classe Activité:
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error
}
}
Si votre application inclut d'autres bibliothèques natives dépendantes d'OpenCV, vous devez les charger après l'initialisation d'OpenCV:
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error
} else {
System.loadLibrary("my_jni_lib1");
System.loadLibrary("my_jni_lib2");
}
}
Remarque:
initDebug()
méthodeinitDebug()
est obsolète pour le code de production. Il est conçu à des fins de développement expérimental et local uniquement. Si vous souhaitez publier votre approche d'utilisation de l'application avec l'initialisation asynchrone.