web-dev-qa-db-fra.com

OpenCV + Android + Unity

Je cherche un moyen d'utiliser OpenCV dans un projet Unity et ma plateforme cible est un appareil Android.

Je sais que certains actifs existent sur le magasin d'actifs Unity mais je NE PAS vouloir les utiliser car je les trouve beaucoup trop chers.

Je parviens à utiliser opencv dans Unity en tant que plug-ins natifs C++ en précompilant OpenCV dans les dll en utilisant this tutoriel, mais dll signifie Windows Desktop donc cela ne m'aide pas beaucoup à construire mon projet pour Android.

J'ai également trouvé des archives jar opencv, je sais qu'elles peuvent être facilement importées dans Unity, mais je ne sais pas comment faire la prochaine étape: c'est comment accéder aux trucs OpenCV à partir des scripts Unity C #.

Donc, si quelqu'un sait comment configurer même un projet de monde bonjour factice en utilisant OpenCV dans l'éditeur Unity pour la construction sur Android, ou a même des indices, je prendrais toutes les informations à ce sujet.

Merci d'avance.

PS: Je sais que cette question est une sorte de vague, et croyez-moi, ce n'est pas une question LMGFY car sur Google, il y a beaucoup de questions comme celle-ci et pas de vraie réponse, alors s'il vous plaît ne vous précipitez pas -1 vote.

[~ # ~] mise à jour [~ # ~]

En utilisant this tutoriel, j'ai réussi à construire opencv pour Android en utilisant Android studio, mais je ne sais toujours pas comment utiliser OpenCV à partir de scripts C #. Par exemple, comment créer un cv :: Mat?

Alors ce que j'ai réussi à faire:

  • Construisez OpenCV et exécutez du code natif en utilisant Android studio (donc depuis Java).
  • Construisez exemple natif Unity (une seule fonction C) et appelez-le à partir d'un script C #.

Mais je n'arrive toujours pas à comprendre comment créer du code C++ avec les dépendances OpenCV et appeler ce code à partir d'un script C #.

11
Pierre Baret

J'ai donc finalement réussi à le faire fonctionner !!!!!!!!!! =)

Je poste ici la façon dont cela a fonctionné pour moi. Donc, ce que j'ai réussi à faire, c'est de créer une bibliothèque .so C++ avec un lien vers OpenCV avec Visual Studio. Importez cette bibliothèque dans Unity et créez une fonction d'appel très simple Android application définie dans la bibliothèque .so. Exécutez l'application sur un téléphone Android.

Configuration utilisée:

  • Unity 2017.2.0f2
  • Visual Studio 2017
  • OpenCV 3.3.1 pour Android. opencv-3.3.1-Android-sdk.Zip téléchargeable depuis site Web OpenCV .
  • Smartphone Android: testé sur Lenovo Phab 2 Pro (Google Tango Phone) et HTC 10

Notez que les étapes que je vais décrire ont fonctionné pour moi, mais cela pourrait être différent pour vous si vous avez un autre processeur sur votre appareil Android (vous devrez construire pour ARM64 au lieu de ARM par exemple, mais la vérité est que ces étapes ne sont qu'un exemple).

Je suppose que vous avez déjà installé Android SDK, NDK et Unity sur votre ordinateur, et que vous êtes déjà en mesure de créer Android application avec Unity.

ÉTAPE 1: créez une bibliothèque C++ Android Library avec Visual Studio 2017.

  • Fichier> Nouveau> Projet

Dans le menu déroulant de gauche, accédez à Modèles> Visual C++> Multiplateforme> Android, puis sélectionnez "Bibliothèque partagée dynamique (Android)". (Vous devrez peut-être installer les outils VS pour pouvoir créer pour Android avec VS2017). Je conserverai le nom par défaut "SharedObject1" pour cet exemple.

New Project Selection

Dans "Plateforme de solutions" (à côté de la liste déroulante Débogage/Sortie), sélectionnez "ARM". Je vous suggère de construire dans la version mais ici, nous resterons dans le débogage car le flux de travail est exactement le même.

enter image description here

ÉTAPE 2: Liez ce projet C++ Android Project avec OpenCV pour Android.

  • Extrayez opencv-3.3.1-Android-sdk.Zip où vous voulez (choisissez et rappelez-vous néanmoins l'endroit car vous devrez conserver les fichiers à cet endroit). Vous devriez avoir un dossier avec 3 sous-dossiers appelés "apk", "samples" et "sdk".
  • Dans Visual Studio, accédez à Projet> Propriétés SharedObject1. Dans la configuration, choisissez "Toutes les configurations" (il s'applique donc à la fois au débogage et à la version) et la plate-forme, choisissez "ARM". Ensuite:
    • Sous C/C++, ajoutez le chemin FULL aux inclusions d'OpenCV à "Additional Include Directories". Ce chemin est: C:\Path-to-OpenCV-Android-sdk\sdk\native\jni\include.
    • Sous l'éditeur de liens> général, ajoutez le chemin d'accès complet aux bibliothèques d'OpenCV aux "répertoires de bibliothèque supplémentaires". Ce chemin est: C:\Path-to-OpenCV-Android-sdk\sdk\native\libs\armeabi-v7a.
    • Sous l'éditeur de liens> entrée, ajoutez le chemin d'accès complet au fichier de bibliothèques d'OpenCV à "dépendances supplémentaires". Ce chemin est: C:\Path-to-OpenCV-Android-sdk\sdk\native\libs\armeabi-v7a\libopencv_Java3.so.

Notez qu'au lieu du chemin complet, vous pouvez utiliser la variable d'environnement si vous savez comment les définir. Je ne l'expliquerai pas ici.

ÉTAPE 3: Il est temps d'écrire du code C++/OpenCV pour notre bibliothèque et de le construire

ShareObject1.h

extern "C"
{
    namespace SharedObject1
    {
        float Foopluginmethod();
    }
}

ShareObject1.cpp

#include "SharedObject1.h"
#include <opencv2\core.hpp> // use OpenCV in this C++ Android Library

extern "C" 
{
    float SharedObject1::Foopluginmethod()
    {
        cv::Mat img(10,10,CV_8UC1); // use some OpenCV objects
        return img.rows * 1.0f;     // should return 10.0f
    }
}

Créez ensuite la bibliothèque: Build> Build Solution. Si vous avez des erreurs comme "Fichiers non trouvés blablabla", vérifiez que vous avez mis les chemins complets dans STEP 2 ou vérifiez vos variables d'environnement. Si vous avez d'autres erreurs, je ne sais pas, demandez dans les commentaires.

Cela aurait dû générer un fichier libSharedObject1.so sous Path-to-your-VS-Project\SharedObject1\ARM\Debug (ou Release).

ÉTAPE 4: Passons à Unity

  • Créez un nouveau projet Unity et nommez-le comme vous le souhaitez.
  • Créez une nouvelle scène et enregistrez-la.
  • Fichier> Paramètres de construction. Sous Plate-forme, sélectionnez Android et cliquez sur "Switch Plateform".
  • Cliquez sur Player Settings. Sous "Autres paramètres", remplacez le nom du package par ce que vous ressentez en ce moment (Unity n'aime pas la valeur par défaut). Sélectionnez "ARMv7" pour le filtre de périphérique.
  • Ajoutez votre scène à la construction.

Dans votre scène, sélectionnez la caméra principale et ajoutez-y un nouveau script C # nommé "CallNativeCode": "Ajouter un composant"> tapez "CallNativeCode"> Nouveau script> Créer et ajouter. Dans l'inspecteur, dans Clear Flags choisissez "Solid color" et mettez une couleur foncée (c'est juste pour la démo rapide).

CallNativeCode.cs

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class CallNativeCode : MonoBehaviour
{    
    [DllImport("SharedObject1")]
    private static extern float Foopluginmethod();

    void OnGUI ()
    {
        // This Line should display "Foopluginmethod: 10"
        GUI.Label(new Rect(15, 125, 450, 100), "Foopluginmethod: " + Foopluginmethod());
    }
}

Dans le dossier Assets, créez un sous-dossier appelé "Plugins" (l'orthographe est importante) et un autre sous-dossier sous Plugins appelé "Android". Dans ce dossier, copiez les fichiers libSharedObject1.so et libopencv_Java3.so (les chemins d'accès à ces deux fichiers se trouvent aux ÉTAPES 2 et 3). Vous devriez donc avoir quelque chose comme ça: Unity Editor

Sélectionnez libSharedObject1.so dans l'éditeur Unity et vérifiez que dans l'inspecteur, les plates-formes sélectionnées pour le plug-in n'ont que Android vérifié, et que le CPU est ARMv7. idem pour libopencv_Java3.so.

Maintenant, vous pouvez créer et exécuter votre application sur un téléphone et profitez-en! ;-)

Donc, ce n'est qu'une application factice, mais elle affiche la bonne phrase, cela fonctionne !!! =) Cela signifie que nous avons réussi à rendre notre code Android Unity app OpenCV C++. En ce qui concerne le code OpenCV C++ plus complexe, eh bien, ce n'est pas le sujet ici, il est temps de laisser libre cours à votre créativité .

ScreenShot of what you should have

16
Pierre Baret

C'est juste pour ajouter à la réponse de Pierre, je voulais commenter mais je n'ai pas assez de réputation. J'ai suivi sa réponse en utilisant la dernière version d'OpenCV (4.0.1) et il y avait quelques choses supplémentaires que je devais faire.

Tout d'abord, remplacez l'importation par #include <opencv2/opencv.hpp>. L'autre instruction d'importation pointe vers l'ancien code.

Accédez ensuite aux propriétés du projet et sélectionnez C/C++ -> Langue. Définissez la norme de langage sur C++ 11 et définissez Activer les informations de type à l'exécution sur oui.

Ensuite, accédez à Génération de code et définissez Activer les exceptions C++ sur Oui.

Après cela, vous devriez être prêt.

3
Ninjaman494