OpenCV dans Android Studio

141

Je souhaite utiliser la bibliothèque OpenCV dans mon application avec Android Studio. J'ai suivi les instructions trouvées ici mais j'obtiens une erreur

Configuration avec le nom 'default' introuvable

Qu'est-ce qui ne va pas?

J'utilise Android Studio 1.0 avec gradle 2.2.1.

Bartosz Bialecki
la source
1
Maintenant, nous pourrions importer des modules avec Android Studio et les étapes pourraient être beaucoup plus simples. Pouvez-vous essayer ce stackoverflow.com/a/27356635/1180117
Kiran
Merci, ça marche. Écrivez-le comme une réponse puis je pourrai l'accepter.
Bartosz Bialecki
@BartoszBialecki @Kiran, je l'ai suivi à l'étape n ° 4, je ne trouve pas le nativerépertoire sous mon sdk répertoire, est-ce qu'il me manque quelque chose?
Romantic Electron
1
@RomanticElectron vous devez ajouter le répertoire natvie à partir du sdk de la bibliothèque OpenCV, pas du sdk Android.
Bartosz Bialecki
@BartoszBialecki merci
Romantic Electron

Réponses:

312

Les étapes ci-dessous pour utiliser Android OpenCV sdk dans Android Studio. Ceci est une version simplifiée de cette ( 1 ) réponse SO.

  1. Téléchargez le dernier sdk OpenCV pour Android depuis OpenCV.org et décompressez le fichier zip.
  2. Importez OpenCV dans Android Studio , à partir du fichier -> Nouveau -> Module d'importation , choisissez le dossier sdk / java dans l'archive opencv décompressée.
  3. Mettez à jour build.gradle sous le module OpenCV importé pour mettre à jour 4 champs correspondant à votre projet build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion et d) targetSdkVersion.
  4. Ajoutez une dépendance de module par Application -> Paramètres du module et sélectionnez l' onglet Dépendances . Cliquez sur + icône en bas, choisissez Dépendance du module et sélectionnez le module OpenCV importé.
    • Pour Android Studio v1.2.2, pour accéder aux paramètres du module: dans la vue du projet, cliquez avec le bouton droit sur le module dépendant -> Ouvrir les paramètres du module
  5. Copiez le dossier libs sous sdk / native dans Android Studio sous app / src / main .
  6. Dans Android Studio, renommez le répertoire libs copié en jniLibs et nous avons terminé.

L'étape (6) est que le studio Android attend des bibliothèques natives au app/src/main/jniLibslieu d'un libsdossier plus ancien . Pour ceux qui découvrent Android OpenCV, ne manquez pas les étapes ci-dessous

  • include static{ System.loadLibrary("opencv_java"); }(Remarque: pour OpenCV version 3 à cette étape, vous devez à la place charger la bibliothèque opencv_java3.)
  • Pour l'étape (5), si vous ignorez les bibliothèques de plate-forme comme x86, assurez-vous que votre appareil / émulateur n'est pas sur cette plate-forme.

OpenCV écrit est en C / C ++. Les wrappers Java sont

  1. Android OpenCV SDK - OpenCV.org a maintenu le wrapper Android Java. Je suggère celui-ci.
  2. OpenCV Java - OpenCV.org a maintenu le wrapper Java de bureau généré automatiquement.
  3. JavaCV - wrapper Java populaire maintenu par des développeurs indépendants. Pas spécifique à Android. Cette bibliothèque peut être désynchronisée avec les versions plus récentes d'OpenCV.
Kiran
la source
1
Je reçois des erreurs après la deuxième étape, Dois-je supprimer le javadocsrépertoire? .Il me demande également d'installer android sdk 14bien que je cible les appareils qui prennent en chargeandroid sdk 15
Romantic Electron
1
@RomanticElectron J'espère que vous avez téléchargé OpenCV4Android 2.4.10 à partir du lien sourceforge.net/projects/opencvlibrary/files/opencv-android/... et pas cette version de bureau Java?
Kiran
2
Ok j'ai compris, je pensais que vous parliez du sdkrépertoire d'installation sur mon système pendant que vous Android Open CV SDKparliez du répertoire qui vient avec .Ok terminé l'étape 6. Où dois-je inclure static{ System.loadLibrary("opencv_java"); }?
Romantic Electron
5
@RomanticElectron où incluez-vous static {System.loadLibrary ("opencv_java"); }? Vous dites "Merci, je l'ai" mais il ne semble pas y avoir de message entre les deux. Ensuite, vous dites que ce n'est pas nécessaire. Pourriez-vous expliquer un peu plus? Merci.
puntofisso
8
pour toute personne ayant l' android-14erreur après l'importation du module à l'étape 2, vous devez éditer manuellement le build.gradledans le répertoire openCV de votre projet comme indiqué à l'étape 3.
paradite
144

Intégration d'OpenCV v3.1.0 dans Android Studio v1.4.1 , des instructions avec des détails supplémentaires et des captures d'écran de type voici ce que vous devriez obtenir.

La plus grande partie du mérite revient à Kiran, Kool, 1 "et SteveLiles sur opencv.org pour leurs explications. J'ajoute cette réponse car je pense que l'interface d'Android Studio est maintenant suffisamment stable pour fonctionner avec ce type d'intégration De toute façon, je dois écrire ces instructions pour notre projet.

Les développeurs AS expérimentés trouveront une partie de ce pédant. Cette réponse s'adresse aux personnes ayant une expérience limitée dans Android Studio.

  1. Créez un nouveau projet Android Studio à l'aide de l'assistant de projet (Menu: / Fichier / Nouveau projet):

    • Appelez-le " cvtest1 "
    • Facteur de forme: API 19, Android 4.4 (KitKat)
    • Activité vide nommée MainActivity

      Vous devez avoir un répertoire cvtest1 dans lequel ce projet est stocké. (la barre de titre du studio Android vous montre où se trouve cvtest1 lorsque vous ouvrez le projet)

  2. Vérifiez que votre application fonctionne correctement. Essayez de changer quelque chose comme le texte "Hello World" pour confirmer que le cycle de construction / test vous convient. (Je teste avec un émulateur d'un appareil API 19).

  3. Téléchargez le package OpenCV pour Android v3.1.0 et décompressez-le dans un répertoire temporaire quelque part. (Assurez-vous qu'il s'agit du package spécifiquement pour Android et pas seulement du package OpenCV pour Java.) J'appellerai ce répertoire " unzip-dir " Sous unzip-dir, vous devriez avoir un répertoire sdk / native / libs avec des sous-répertoires commençant par des choses comme arm ..., mips ... et x86 ... (un pour chaque type d '"architecture" sur lequel tourne Android)

  4. Depuis Android Studio, importez OpenCV dans votre projet en tant que module: Menu: / Fichier / Nouveau / Import_Module :

    • Répertoire source: {unzip-dir} / sdk / java
    • Nom du module: Android Studio remplit automatiquement ce champ avec openCVLibrary310 (le nom exact n'a probablement pas d'importance, mais nous allons continuer avec ça).
    • Cliquez sur suivant . Vous obtenez un écran avec trois cases à cocher et des questions sur les pots, les bibliothèques et les options d'importation. Tous les trois doivent être vérifiés. Cliquez sur Terminer.

      Android Studio commence à importer le module et vous affiche un fichier import-summary.txt contenant une liste de ce qui n'a pas été importé (principalement des fichiers javadoc) et d'autres informations. entrez la description de l'image ici

      Mais vous obtenez également un message d'erreur indiquant n'a pas réussi à trouver la cible avec la chaîne de hachage « android-14 » ... . Cela se produit parce que le fichier build.gradle dans le fichier zip OpenCV que vous avez téléchargé indique de compiler à l'aide de l'API Android version 14, que vous n'avez pas par défaut avec Android Studio v1.4.1. entrez la description de l'image ici

  5. Ouvrez la boîte de dialogue de structure du projet ( Menu: / File / Project_Structure ). Sélectionnez le module «app», cliquez sur l' onglet Dépendances et ajoutez : openCVLibrary310 comme dépendance de module. Lorsque vous sélectionnez Add / Module_Dependency, il doit apparaître dans la liste des modules que vous pouvez ajouter. Il apparaîtra maintenant comme une dépendance, mais vous obtiendrez quelques autres erreurs cannot-find-android-14 dans le journal des événements.

  6. Recherchez dans le fichier build.gradle votre module d'application. Il existe plusieurs fichiers build.gradle dans un projet Android. Celui que vous voulez se trouve dans le répertoire cvtest1 / app et, dans la vue du projet, il ressemble à build.gradle (Module: app) . Notez les valeurs de ces quatre champs:

    • compileSDKVersion (le mien dit 23)
    • buildToolsVersion (le mien dit 23.0.2)
    • minSdkVersion (le mien dit 19)
    • targetSdkVersion (le mien dit 23)
  7. Votre projet a maintenant un répertoire cvtest1 / OpenCVLibrary310 mais il n'est pas visible depuis la vue du projet:

entrez la description de l'image ici

Utilisez un autre outil, tel qu'un gestionnaire de fichiers, et accédez à ce répertoire. Vous pouvez également basculer la vue du projet d' Android vers Project Files et vous pouvez trouver ce répertoire comme indiqué dans cette capture d'écran: entrez la description de l'image ici

À l'intérieur, il y a un autre fichier build.gradle (il est mis en évidence dans la capture d'écran ci-dessus). Mettez à jour ce fichier avec les quatre valeurs de l'étape 6.

  1. Resynchronisez votre projet, puis nettoyez / reconstruisez-le. (Menu: / Build / Clean_Project ) Il devrait nettoyer et construire sans erreurs et vous devriez voir de nombreuses références à : openCVLibrary310 dans l' écran 0: Messages .

    entrez la description de l'image ici

    À ce stade, le module doit apparaître dans la hiérarchie du projet en tant que openCVLibrary310 , tout comme app . (Notez que dans ce petit menu déroulant, je suis revenu de Project View à Android View ). Vous devriez également voir un fichier build.gradle supplémentaire sous "Gradle Scripts" mais je trouve l'interface d'Android Studio un peu glitch et parfois elle ne le fait pas tout de suite. Essayez donc de resynchroniser, de nettoyer et même de redémarrer Android Studio.

    Vous devriez voir le module openCVLibrary310 avec toutes les fonctions OpenCV sous java comme dans cette capture d'écran:

    entrez la description de l'image ici

  2. Copiez le répertoire {unzip-dir} / sdk / native / libs (et tout ce qu'il contient ) dans votre projet Android, dans cvtest1 / OpenCVLibrary310 / src / main / , puis renommez votre copie de libs en jniLibs . Vous devriez maintenant avoir un répertoire cvtest1 / OpenCVLibrary310 / src / main / jniLibs . Resynchronisez votre projet et ce répertoire devrait maintenant apparaître dans la vue du projet sous openCVLibrary310 .

    entrez la description de l'image ici

  3. Accédez à la méthode onCreate de MainActivity.java et ajoutez ce code:

    if (!OpenCVLoader.initDebug()) {
        Log.e(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), not working.");
    } else {
        Log.d(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), working.");
    }

    Exécutez ensuite votre application. Vous devriez voir des lignes comme celle-ci dans le moniteur Android: entrez la description de l'image ici (Je ne sais pas pourquoi cette ligne avec le message d'erreur est là)

  4. Essayez maintenant d'utiliser du code openCV. Dans l'exemple ci-dessous, j'ai copié un fichier .jpg dans le répertoire de cache de l'application cvtest1 sur l'émulateur Android. Le code ci-dessous charge cette image, exécute l'algorithme de détection des bords astucieux, puis réécrit les résultats dans un fichier .png dans le même répertoire.

    Placez ce code juste en dessous du code de l'étape précédente et modifiez-le pour qu'il corresponde à vos propres fichiers / répertoires.

    String inputFileName="simm_01";
    String inputExtension = "jpg";
    String inputDir = getCacheDir().getAbsolutePath();  // use the cache directory for i/o
    String outputDir = getCacheDir().getAbsolutePath();
    String outputExtension = "png";
    String inputFilePath = inputDir + File.separator + inputFileName + "." + inputExtension;
    
    
    Log.d (this.getClass().getSimpleName(), "loading " + inputFilePath + "...");
    Mat image = Imgcodecs.imread(inputFilePath);  
    Log.d (this.getClass().getSimpleName(), "width of " + inputFileName + ": " + image.width());
    // if width is 0 then it did not read your image.
    
    
    // for the canny edge detection algorithm, play with these to see different results
    int threshold1 = 70;
    int threshold2 = 100;
    
    Mat im_canny = new Mat();  // you have to initialize output image before giving it to the Canny method
    Imgproc.Canny(image, im_canny, threshold1, threshold2);
    String cannyFilename = outputDir + File.separator + inputFileName + "_canny-" + threshold1 + "-" + threshold2 + "." + outputExtension;
    Log.d (this.getClass().getSimpleName(), "Writing " + cannyFilename);
    Imgcodecs.imwrite(cannyFilename, im_canny);
  5. Exécutez votre application. Votre émulateur doit créer une image «bord» en noir et blanc. Vous pouvez utiliser Android Device Monitor pour récupérer la sortie ou écrire une activité pour l'afficher.

le Gotchas :

  • Si vous abaissez votre plate-forme cible sous KitKat, certaines des bibliothèques OpenCV ne fonctionneront plus, en particulier les classes liées à org.opencv.android.Camera2Renderer et d'autres classes associées. Vous pouvez probablement contourner ce problème en supprimant simplement les fichiers OpenCV .java appropriés.
  • Si vous augmentez votre plate-forme cible à Lollipop ou au-dessus, mon exemple de chargement d'un fichier peut ne pas fonctionner car l'utilisation de chemins de fichiers absolus est mal vue. Vous devrez peut-être changer l'exemple pour charger un fichier depuis la galerie ou ailleurs. Il existe de nombreux exemples qui flottent.
ssimm
la source
2
Édition du 16 février: jniLibs maintenant dans le répertoire openCVLibrary310, pas dans le répertoire principal de l'application. Les deux fonctionnent mais il me semble plus propre de les garder dans la partie ouverte. Plus d' autres captures d'écran et la partie "Gotchas".
ssimm
Je pense que certaines déclarations d'importation manquent, sinon très bon travail! +1
Allan Nørgaard
1
J'ai suivi votre réponse mais j'ai échoué. 1 j'ai eu l'erreur OpenCV error: Cannot load info library for OpenCV 2 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/www.deven.com.opencv-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libopencv_java3.so Ce que ces erreurs à propos de j'ai fait étape par étape au fur et à mesure que vous écriviez.
Devendra Singh
2
@DevendraSingh J'ai eu la même erreur que vous mais j'ai réalisé que j'avais manqué l'étape 9.
aasu
2
et si nous voulons coder en C ++ pour opencv sur android studio?
user8663682
38

Pour tous ceux qui ont senti qu'ils voulaient s'enfuir avec toutes les étapes et les captures d'écran des (super!) Réponses ci-dessus, cela a fonctionné pour moi avec android studio 2.2.1:

  1. Créez un nouveau projet, nommez-le comme vous le souhaitez et prenez la valeur par défaut (minSdkVersion 15 convient).
  2. Téléchargez le fichier zip à partir d'ici: https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (j'ai téléchargé la version 3.1.0, mais il peut y avoir une version plus récente).
  3. Décompressez le fichier zip, le meilleur endroit est dans le dossier de votre espace de travail, mais cela n'a pas vraiment d'importance.
  4. À l'intérieur Android Studio, cliquez File->New-> Import Moduleet accédez à \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\javaet appuyez sur OK, puis acceptez toutes les boîtes de dialogue par défaut.
  5. Dans le gradlefichier de votre app module, ajoutez ceci au bloc des dépendances:

    dependencies {
        compile project(':openCVLibraryXYZ')
        //rest of code
    }

Où XYZ est la version exacte que vous téléchargez, par exemple dans mon cas:

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }
yshahak
la source
1
Sympa et simple, thnx ;-) Fonctionne aussi pour la version 3.2.0.
blacharnia
2
Merci, c'est en effet la solution la plus simple. Un point de ma part. Le nouveau module OpenCV n'a pas pu être compilé. La réponse ici m'a aidé à résoudre ce problème stackoverflow.com/a/40302788/408780
Tima
juste pour ajouter à ce que @blacharnia a dit, assurez-vous simplement d'utiliser 'compile project (': openCVLibrary320 ')' dans la section des dépendances du berceau au lieu de 310
Abraham Philip
Peut-être plus généralement, pour ajouter aux commentaires ci-dessus, utilisez "compile project (': openCVLibraryXYZ')" où XYZ est le numéro de version du SDK Android openCV sans les 'points' - cela fonctionne également maintenant pour la version 3.4.0 -> ie utiliser "compile project (': openCVLibrary340')"
Mick
@Mick merci, j'ai édité la réponse selon votre suggestion.
yshahak
10

Android Studio 3.4 + OpenCV 4.1

  1. Téléchargez le dernier fichier zip OpenCV à partir d' ici (la dernière version actuelle est 4.1.0) et décompressez-le dans votre espace de travail ou dans un autre dossier.

  2. Créez normalement un nouveau projet Android Studio. Cliquez File->New->Import Module, accédez à /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, définissez le nom du module comme opencv, cliquez Nextet décochez toutes les options à l'écran.

  3. Activez Projectle mode d'affichage des fichiers (le mode par défaut est Android). Dans le opencv/build.gradlechangement de fichier apply plugin: 'com.android.application'à apply plugin: 'com.android.library'et remplacer application ID "org.opencv"par

    minSdkVersion 21
    targetSdkVersion 28

    (selon les valeurs de app/build.gradle). Projet de synchronisation avec les fichiers Gradle.

  4. Ajoutez cette chaîne au bloc de dépendances dans le app/build.gradlefichier

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  5. Sélectionnez à nouveau Androidle mode d'affichage des fichiers. Faites un clic droit sur le appmodule et allez-y New->Folder->JNI Folder. Sélectionnez le changement d'emplacement du dossier et définissez-le src/main/jniLibs/.

  6. Sélectionnez à nouveau Projectle mode d'affichage des fichiers et copiez tous les dossiers de /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libsvers app/src/main/jniLibs.

  7. Encore une fois en Androidmode d'affichage de fichier, faites un clic droit sur le appmodule et choisissez Link C++ Project with Gradle. Sélectionnez Build System ndk-buildet le chemin d'accès au OpenCV.mkfichier /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files ne doit contenir aucun espace, ou vous obtiendrez une erreur!

Pour vérifier l'initialisation d'OpenCV, ajoutez un message Toast dans la onCreate()méthode MainActivity :

Toast.makeText(MainActivity.this, String.valueOf(OpenCVLoader.initDebug()), Toast.LENGTH_LONG).show();

Si l'initialisation réussit, vous verrez truedans le message Toast, sinon vous verrez false.

Plo_Koon
la source
Ci-dessus, vous dites "remplacer l'ID d'application" org.opencv "par ....." mais il n'y a rien après le "avec". Pouvez-vous clarifier s'il vous plait? Voulez-vous dire "supprimer l'entrée applicationId et ajouter deux entrées comme suit:"
Dale
@Dale Oui, vous devez remplacer la application ID "org.opencv"chaîne par deux chaînes: minSdkVersion 21et targetSdkVersion 28(selon les valeurs du fichier app / build.gradle)
Plo_Koon
J'ai suivi toutes les étapes que vous avez décrites. Mais l'obtention de l'erreur E / art: dlopen ("/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) a échoué: dlopen a échoué: bibliothèque "libc ++ _ shared.so" introuvable
Masthan le
1

Cela a fonctionné pour moi et était aussi simple que d'ajouter une dépendance gradle:

https://bintray.com/seesaa/maven/opencv#

https://github.com/seesaa/opencv-android

La seule mise en garde étant que je devais utiliser un périphérique de débogage matériel car les émulateurs de bras fonctionnaient trop lentement pour moi (comme AVD Manager le dit), et, comme décrit dans le repo README, cette version n'inclut pas le support x86 ou x86_64.

Il semble construire et le test suggéré:

static {
    OpenCVLoader.initDebug();
}

crache un tas de sortie qui me semble juste.

Naumdev
la source
Cela provenait d'un nouveau projet dans le studio Android. Je n'ai rien importé, je n'ai rien téléchargé, etc. Il suffit d'ajouter la dépendance gradle et la synchronisation.
Naumdev
0

Toute personne confrontée à un problème lors de la création de jniLibs cpp est affichée .. il suffit d'ajouter ndk ..

Aklesh Singh
la source
0

Dans votre build.gradle

repositories {
  jcenter()
}

implementation 'com.quickbirdstudios:opencv:4.1.0'

Plus d'infos

Raymond Chenon
la source