Saltar al contenido

OpenCV + Android + Unity

Te recomendamos que pruebes esta resolución en un ambiente controlado antes de pasarlo a producción, un saludo.

Solución:

¡¡¡¡Así que finalmente logré hacerlo funcionar !!!!!!!!!! =)

Estoy publicando la forma en que funcionó para mí aquí. Entonces, lo que logré hacer es construir una biblioteca .so C ++ con un enlace a OpenCV con Visual Studio. Importe esta biblioteca en Unity y cree una función de llamada de aplicación de Android muy simple definida en la biblioteca .so. Ejecute la aplicación en un teléfono Android.

Configuración utilizada:

  • Unidad 2017.2.0f2
  • Visual Studio 2017
  • OpenCV 3.3.1 para Android. opencv-3.3.1-android-sdk.zip descargable desde el sitio web de OpenCV.
  • Teléfono inteligente Android: probado en Lenovo Phab 2 Pro (Google Tango Phone) y HTC 10

Tenga en cuenta que los pasos que describiré funcionaron para mí, pero podrían ser diferentes para usted si tiene una CPU diferente en su dispositivo Android (tendrá que compilar para ARM64 en lugar de ARM, por ejemplo, pero la verdad es que estos pasos son solo un ejemplo).

Asumiré que ya tiene Android SDK, NDK y Unity instalados en su computadora, por lo que ya puede crear una aplicación de Android con Unity.

PASO 1: cree una biblioteca de Android C ++ con Visual Studio 2017.

  • Archivo> Nuevo> Proyecto

En el menú desplegable de la izquierda, vaya a Plantillas> Visual C ++> Plataforma cruzada> Android y seleccione “Biblioteca compartida dinámica (Android)”. (Es posible que deba instalar las herramientas VS para poder compilar para Android con VS2017). Mantendré el nombre predeterminado “SharedObject1” para este ejemplo.

Selección de nuevo proyecto

En “Plataforma de soluciones” (junto al menú desplegable Depurar / Liberar), seleccione “ARM”. Le sugiero que lo compile en la versión, pero aquí continuaremos con la depuración, ya que el flujo de trabajo es exactamente el mismo.

ingrese la descripción de la imagen aquí

PASO 2: Vincule este proyecto de Android C ++ con OpenCV para Android.

  • Extraer opencv-3.3.1-android-sdk.zip donde quiera (elija y recuerde el lugar de todos modos porque necesitará guardar los archivos en este lugar). Debería tener una carpeta con 3 subcarpetas llamadas “apk”, “samples” y “sdk”.
  • En Visual Studio, vaya a Proyecto> Propiedades de SharedObject1. En la configuración, elija “Todas las configuraciones” (por lo que se aplica tanto en depuración como en versión), y la plataforma elija “ARM”. Luego:
    • En C / C ++, agregue la ruta COMPLETA a las inclusiones de OpenCV a “Directorios de inclusión adicionales”. Esta ruta es: C: Path-to-OpenCV-android-sdk sdk native jni include.
    • En Vinculador> General, agregue la ruta COMPLETA a las bibliotecas de OpenCV a “Directorios de bibliotecas adicionales”. Esta ruta es: C: Path-to-OpenCV-android-sdk sdk native libs armeabi-v7a.
    • En Vinculador> Entrada, agregue la ruta COMPLETA al archivo de bibliotecas de OpenCV en “Dependencias adicionales”. Esta ruta es: C: Path-to-OpenCV-android-sdk sdk native libs armeabi-v7a libopencv_java3.so.

Tenga en cuenta que en lugar de la ruta completa, puede usar la variable de entorno si sabe cómo configurarlas. No lo explicaré aquí.

PASO 3: Es hora de escribir código C ++ / OpenCV para nuestra biblioteca y compilarlo

ShareObject1.h

extern "C"

    namespace SharedObject1
    
        float Foopluginmethod();
    

ShareObject1.cpp

#include "SharedObject1.h"
#include  // 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
    

Luego construya la biblioteca: Build> Build Solution. Si tiene errores aquí como “Archivos no encontrados blablabla”, verifique que puso las rutas completas en el PASO 2 o verifique sus variables de entorno. Si tiene otros errores, no lo sé, pregunte en los comentarios.

Esto debería haber generado un libSharedObject1.so archivo en Path-to-your-VS-Project SharedObject1 ARM Debug (o Release).

PASO 4: Vayamos a Unity

  • Cree un nuevo proyecto de Unity y asígnele el nombre que desee.
  • Cree una nueva escena y guárdela.
  • Archivo> Configuración de compilación. En Plataforma, seleccione Android y haga clic en “Cambiar plataforma”.
  • Haga clic en Configuración del reproductor. En “Otras configuraciones”, cambia el nombre del paquete a lo que te apetezca en este momento (a Unity no le gusta el valor predeterminado). Seleccione “ARMv7” para Filtro de dispositivo.
  • Agrega tu escena a la construcción.

En su escena, seleccione la cámara principal y agregue un nuevo script de C # llamado “CallNativeCode”: “Add Component”> escriba “CallNativeCode”> New Script> Create And Add. En el inspector, en Clear Flags, elija “Color sólido” y coloque un color oscuro (esto es solo para la demostración rápida).

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

En la carpeta Activos, cree una subcarpeta llamada “Complementos” (la ortografía es importante) y otra subcarpeta en Complementos llamada “Android”. En esta carpeta, copie los archivos libSharedObject1.so y libopencv_java3.so (las rutas a estos dos archivos se encuentran en los PASOS 2 y 3). Entonces deberías tener algo como eso:Editor de unidad

Seleccione libSharedObject1.so en Unity Editor y verifique que en el inspector las plataformas seleccionadas para el complemento solo hayan marcado Android, y que la CPU sea ARMv7. Haz lo mismo por libopencv_java3.so.

¡Ahora puede crear y ejecutar su aplicación en un teléfono y disfrutar! 😉

Así que esta es solo una aplicación ficticia, pero muestra la frase correcta, ¡¡¡funciona !!! =) Eso significa que logramos hacer que nuestra aplicación de Android Unity llame al código OpenCV C ++. Con respecto al código OpenCV C ++ más complejo, bueno, este no es el tema aquí, es hora de dejar fluir su creatividad.

Captura de pantalla de lo que debería tener

Esto es solo para agregar a la respuesta de Pierre, quería comentar pero no tengo suficiente reputación. Seguí su respuesta usando la última versión de OpenCV (4.0.1) y había algunas cosas adicionales que necesitaba hacer.

Primero, reemplace la importación con #include . La otra declaración de importación apunta al código antiguo.

Luego vaya a las propiedades del proyecto y seleccione C / C ++ -> Idioma. Establezca el estándar de lenguaje en C ++ 11 y establezca Habilitar información de tipo de tiempo de ejecución en sí.

Luego, vaya a Generación de código y establezca Habilitar excepciones de C ++ en sí.

Después de eso, deberías estar listo.

Más adelante puedes encontrar las notas de otros usuarios, tú incluso puedes dejar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *