OpenCV + Android + Einheit

OpenCV + Android + Einheit

Also habe ich es endlich geschafft, es zum Laufen zu bringen !!!!!!!!!! =)

Ich poste hier, wie es bei mir funktioniert hat. Also habe ich es geschafft, eine .so C++-Bibliothek mit Link zu OpenCV mit Visual Studio zu erstellen. Importieren Sie diese Bibliothek in Unity und erstellen Sie eine sehr einfache Aufruffunktion für Android-Anwendungen, die in der .so-Bibliothek definiert ist. Führen Sie die App auf einem Android-Telefon aus.

Verwendete Konfiguration:

  • Einheit 2017.2.0f2
  • Visual Studio 2017
  • OpenCV 3.3.1 für Android. opencv-3.3.1-android-sdk.zip kann von der OpenCV-Website heruntergeladen werden.
  • Android-Smartphone:getestet auf Lenovo Phab 2 Pro (Google Tango Phone) und HTC 10

Beachten Sie, dass die Schritte, die ich beschreiben werde, für mich funktioniert haben, aber es könnte für Sie anders sein, wenn Sie eine andere CPU auf Ihrem Android-Gerät haben (Sie müssen zum Beispiel für ARM64 statt für ARM bauen, aber die Wahrheit ist, dass diese Schritte sind nur ein Beispiel).

Ich gehe davon aus, dass Sie bereits Android SDK, NDK und Unity auf Ihrem Computer installiert haben und dass Sie bereits in der Lage sind, Android-Apps mit Unity zu erstellen.

SCHRITT 1:Erstellen Sie mit Visual Studio 2017 eine C++-Android-Bibliothek.

  • Datei> Neu> Projekt

Gehen Sie im Dropdown-Menü auf der linken Seite zu Vorlagen> Visual C++> Plattformübergreifend> Android und wählen Sie „Dynamic Shared Library (Android)“ aus. (Möglicherweise müssen Sie die VS-Tools installieren, um mit VS2017 für Android erstellen zu können). Ich werde den Standardnamen "SharedObject1" für dieses Beispiel beibehalten.

Wählen Sie in „Lösungsplattform“ (neben dem Dropdown-Menü „Debug/Release“) „ARM“ aus. Ich schlage vor, dass Sie das Release einbauen, aber hier bleiben wir beim Debuggen, da der Workflow genau derselbe ist.

SCHRITT 2:Verknüpfen Sie dieses C++-Android-Projekt mit OpenCV für Android.

  • Extrahieren Sie opencv-3.3.1-android-sdk.zip wohin Sie wollen (wählen und merken Sie sich trotzdem den Ort, da Sie die Dateien an diesem Ort aufbewahren müssen). Sie sollten einen Ordner mit 3 Unterordnern namens "apk", "samples" und "sdk" haben.
  • Gehen Sie in Visual Studio zu Project> SharedObject1 Properties. Wählen Sie in der Konfiguration "Alle Konfigurationen" (so dass es sowohl in Debug als auch in Release gilt) und die Plattform "ARM". Dann:
    • Fügen Sie unter C/C++ den VOLLSTÄNDIGEN Pfad zu den OpenCV-Includes zu "Zusätzliche Include-Verzeichnisse" hinzu. Dieser Pfad lautet:C:\Path-to-OpenCV-android-sdk\sdk\native\jni\include.
    • Fügen Sie unter Linker> Allgemein den VOLLSTÄNDIGEN Pfad zu den Bibliotheken von OpenCV zu "Zusätzliche Bibliotheksverzeichnisse" hinzu. Dieser Pfad lautet:C:\Path-to-OpenCV-android-sdk\sdk\native\libs\armeabi-v7a.
    • Fügen Sie unter Linker> Input den VOLLSTÄNDIGEN Pfad zur Bibliotheksdatei von OpenCV zu "Additional Dependencies" hinzu. Dieser Pfad lautet:C:\Path-to-OpenCV-android-sdk\sdk\native\libs\armeabi-v7a\libopencv_java3.so.

Beachten Sie, dass Sie anstelle des vollständigen Pfads Umgebungsvariablen verwenden können, wenn Sie wissen, wie sie festgelegt werden. Ich werde das hier nicht erklären.

SCHRITT 3:Zeit, etwas C++/OpenCV-Code für unsere Bibliothek zu schreiben und zu bauen

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
    }
}

Erstellen Sie dann die Bibliothek:Erstellen> Projektmappe erstellen. Wenn Sie hier Fehler wie "Dateien nicht gefunden blablabla" haben, überprüfen Sie, ob Sie die vollständigen Pfade in SCHRITT 2 eingegeben haben, oder überprüfen Sie Ihre Umgebungsvariablen. Wenn Sie andere Fehler haben, weiß ich nicht, fragen Sie in den Kommentaren.

Dies sollte eine libSharedObject1.so generiert haben Datei unter Path-to-your-VS-Project\SharedObject1\ARM\Debug (oder Release).

SCHRITT 4:Gehen wir zu Unity

  • Erstellen Sie ein neues Unity-Projekt und benennen Sie es nach Ihren Wünschen.
  • Erstellen Sie eine neue Szene und speichern Sie sie.
  • Datei> Build-Einstellungen. Wählen Sie unter Plattform Android aus und klicken Sie auf „Platform wechseln“.
  • Klicken Sie auf Player-Einstellungen. Ändern Sie unter „Andere Einstellungen“ den Paketnamen so, wie Sie gerade Lust haben (Unity mag den Standardwert nicht). Wählen Sie „ARMv7“ für den Gerätefilter aus.
  • Fügen Sie Ihre Szene zum Build hinzu.

Wählen Sie in Ihrer Szene die Hauptkamera aus und fügen Sie ihr ein neues C#-Skript mit dem Namen „CallNativeCode“ hinzu:„Komponente hinzufügen“> geben Sie „CallNativeCode“ ein> Neues Skript> Erstellen und hinzufügen. Wählen Sie im Inspektor in Clear Flags "Solid color" und setzen Sie eine dunkle Farbe (dies ist nur für die schnelle Demo).

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());
    }
}

Erstellen Sie im Ordner „Assets“ einen Unterordner mit dem Namen „Plugins“ (die Schreibweise ist wichtig) und einen weiteren Unterordner unter Plugins mit dem Namen „Android“. Kopieren Sie in diesen Ordner die Dateien libSharedObject1.so und libopencv_java3.so (Die Pfade zu diesen beiden Dateien befinden sich in SCHRITT 2 und 3). Also sowas müsstest du haben:

Wählen Sie libSharedObject1.so aus im Unity Editor und überprüfen Sie, ob im Inspektor für Ausgewählte Plattformen für das Plugin nur Android aktiviert ist und dass die CPU ARMv7 ist. Machen Sie dasselbe für libopencv_java3.so .

Jetzt können Sie Ihre App auf einem Telefon erstellen und ausführen und genießen!;-)

Das ist also nur eine Dummy-Anwendung, aber es zeigt den richtigen Satz an, es funktioniert !!! =) Das bedeutet, dass wir es geschafft haben, dass unsere Android-Unity-App OpenCV-C++-Code aufruft. Was komplexeren OpenCV-C++-Code betrifft, nun, das ist hier nicht das Thema, es ist Zeit, Ihrer Kreativität freien Lauf zu lassen.


Dies ist nur eine Ergänzung zu Pierres Antwort. Ich wollte einen Kommentar abgeben, aber ich habe nicht genug Ansehen. Ich folgte seiner Antwort mit der neuesten Version von OpenCV (4.0.1) und es gab ein paar zusätzliche Dinge, die ich tun musste.

Ersetzen Sie zunächst den Import durch #include <opencv2/opencv.hpp> . Die andere import-Anweisung zeigt auf alten Code.

Gehen Sie dann zu den Eigenschaften des Projekts und wählen Sie C/C++->Sprache. Setzen Sie den Sprachstandard auf C++ 11 und setzen Sie Run-Time Type Information aktivieren auf yes.

Gehen Sie dann zu Code Generation und setzen Sie Enable C++ Exceptions auf yes.

Danach sollten Sie fertig sein.