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:
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 #.
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:
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.
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.
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.
ÉTAPE 2: Liez ce projet C++ Android Project avec OpenCV pour Android.
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
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:
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é .
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.