Jump to content
Sign in to follow this  
Jony

Obtener Color32[] de un Texture2D

Recommended Posts

Resulta que WebCamTexture.GetPixels32() obtiene un Color32[] pero si le hago un Texture2D.GetPixels32() obtengo int miplevel.  

Algo bastante liado con este tema por que no lo he usado mucho. Como podria convertir un int miplevel en un color32[]?

 

Un saludo

Share this post


Link to post
Share on other sites

Hola.

De acuerdo con la documentación, no puedes hacer un "Texture2D.GetPixels32()" sobre una WebCamTexture, ya que ésta hereda de "Texture" y no de "Texture2D".

El método a usar es "WebCamTexture.GetPixels()" o "WebCamTexture.GetPixels32()", pero pertenecen a la clase WebCamTexture. Fíjate que la firma del método es diferente, los parámetros formales no incluyen el "mipLevel" (ya que, entiendo yo, la textura generada por la cámara no tiene miplevels, que son diferentes resoluciones de la misma textura usadas durante el rendering).

Si sigues con problemas, pega el código que estés usando y dinos qué intentas hacer.

 

Edited by J Montes

Share this post


Link to post
Share on other sites

Te comento, estoy trabajando con una libreria de AR. Pero esta libreria solo pone filtros a traves de imagenes de la camara, ya sea web o del movil. Pero si intento pasarle un video no funciona. Hable con los de la libreria y me dijeron que se podia amoldar la libreria para que aceptase video. 

La libreria utiliza la WebCamTexture para obtener las imagenes.
   

public bool GetData()
    {
      if (m_webcamTexture)
        {
            // don't change - sequenced to avoid crash
            if (m_webcamTexture.didUpdateThisFrame)
            {




                m_webcamTexture.GetPixels32(m_data);


                return true;
            }
            else
            {
                return false;
            }
        }
        return false;
    }

 

Donde obtiene el GetPixels32 de la webcam y los guarada en  Color32 m_data , es donde quiero intentar textualizar el video y pasarle los datos.

Seria posible? Habria alguna posibilidad de hacerlo?

Un saludo

Edited by pioj
Por favor, usa el <> o el "quote" para pegar código.

Share this post


Link to post
Share on other sites

No lo he probado pero no puedes usar: 

m_webcamTexture.GetPixels32(m_data);

Porque GetPixels32(int) pertenece a Texture2D. Usa:

m_data = m_webcamTexture.GetPixels32();

Donde m_data debería ser de tipo Color32[]  .

Share this post


Link to post
Share on other sites

He encontrado esto en la documentacion, pero no tengo ni idea de como hacerlo.

 

Cómo cambiar la fuente de video

Para reproducir videos, para admitir dispositivos de captura específicos, ... es posible que desee utilizar un marco de video específico como entrada para el motor de seguimiento facial. En el escritorio, la captura de video predeterminada es proporcionada por WebCamTexture de la clase Unity, mientras que en iOS y Android, utilizamos una implementación nativa de la captura de video que está oculta dentro de nuestro complemento.

Para cambiar la fuente de video, puede seguir los siguientes pasos:

  • Compruebe que la captura de video es proporcionada por la capa de Unity y no de forma nativa, vea los parámetros del complemento a continuación:
Screenshot+2019-12-06+at+11.55.30.png
  • Con el modo de captura de video no nativo activado, podemos usar la siguiente función para iniciar una detección / seguimiento de rostros en una imagen determinada:
  • privado xmgMagicFaceBridge.xmgImage m_image; xmgMagicFaceBridge.deeparDeepFaceTrackNonRigidFaces (ref m_image, ...)
  • Puede preparar la imagen de entrada utilizando la función prepareImage () proporcionada, donde el controlador de píxeles describe la ubicación de la memoria de la imagen: xmgMagicFaceBridge.PrepareImage (ref m_image, captureWidth, captureHeight, 4, m_myWebCamEngine.m_PixelsHandle.AddrOfPinnedObject ());

Nota : debe ingresar una imagen que tenga el mismo tamaño que el tamaño declarado en la inicialización del complemento: xmgInitParams.m_processingWidth y xmgInitParams.m_processingHeight)

 

 

 

Esta traducido del Google... jejeje

 

Un saludo

Share this post


Link to post
Share on other sites

A ver... pero entonces no necesitas una WebCamTexture yo creo.

Primero, no traduzcas cosas como "privado xmgMagicFaceBridge" porque el código no se traduce. Es "private". Y yo preferiría las fuentes en inglés y el enlace, pero ya lo he buscado por ahí.

Lo que te están diciendo es que no uses la captura nativa de esta biblioteca (que soporta móviles y/o WebCamTexture en el escritorio). De esta forma, el componente XZIMG deja de gestionar la entrada de video y tendrás que alimentarla tú con imágenes de tu video.

Así que tenemos varias partes:

1) sacar imágenes de tu video
2) ponerlas en un formato que XZIMG pueda entender
3) dárselas a XZIMG.

1) No nos has dicho qué formato de video tienes ni cómo lo estás leyendo. Nunca he usado video en Unity pero por lo que veo hay una cosa llamada VideoPlayer que nos permite acceder a las imágenes de cada frame (https://docs.unity3d.com/ScriptReference/Video.VideoPlayer-texture.html), en formato Texture.

Al parecer esto en realidad es una RenderTexture y puedes obtener la imagen de ahí así como su dirección de memoria. Observa que tendrás que suscribirte a una serie de eventos para saber cuándo la texture presenta datos nuevos, etc. Hay información imprescindible en: https://stackoverflow.com/questions/42747285/get-current-frame-texture-from-videoplayer . Observa que es costoso hacer esto y que quizá más adelante necesites considerar procesar el video de otra manera y no cada frame con este mecanismo, depende mucho de tu caso de uso.

2) Vamos a suponer que el formato no es un problema por ahora.

3) Te dicen que prepares una imagen para contener los datos que la biblioteca procesará. A mí me surge la duda de si esta biblioteca necesita que se le actualice la imagen cada vez  que cambia o hay que pasarle la dirección de memoria y ya "ella se apaña". Como lo segundo sería raro, vamos a suponer lo primero para ir probando.

Primero, declara una variable para la imagen que la bibiloteca procesará:

private xmgMagicFaceBridge.xmgImage m_image;

Después comienza el reconocimiento.

xmgMagicFaceBridge.xzimgMagicFaceTrackNonRigidFaces(ref m_image,...) 

Cada vez que tengas un frame nuevo en el video (lo sabrás por los eventos del VideoPlayer), tendrás que preparar la imagen nueva y dársela a la biblioteca (o quizá cada 2, 3 ó N frames si quieres diezmar la tasa de entrada). En cualquier caso, cada nueva imagen a despachar debes dársela a a XZIMG usando:

xmgMagicFaceBridge.PrepareImage(ref m_image, captureWidth, captureHeight, 4, m_myWebCamEngine.m_PixelsHandle.AddrOfPinnedObject()); 

Aquí, el primer parámetro es la imagen que has creado y es siempre la misma. El ancho y el alto son los del video y te dicen que deben coincidir  con los que hayas usado al inicializar la biblioteca (xmgInitParams.m_processingWidth, and xmgInitParams.m_processingHeight). No sé qué significa el 4 y no encuentro la documentación de este método (que sería bastante útil tener).

El último parámetro es el quid de la cuestión: entiendo que es la dirección de memoria de los bytes de la imagen y que (por el nombre "pinned") nos sugiere que no deben cambiar durante un rato o incluso hasta que vuelvas a llamar a PrepareImage. Esto creo que descartaría usar directamente la dirección de memoria del RenderTexture, si bien no estoy seguro...

Aquí me surgen dudas también. Tendrás que probar a coger los pixels de la RenderTexture y usar la dirección de memoria aquí (que sería el RenderTexture.colorBuffer.GetNativeRenderBufferPtr() ) (https://docs.unity3d.com/ScriptReference/RenderBuffer.GetNativeRenderBufferPtr.html), pero insisto que este buffer quizá cambie concurrentemente. Así que si esto no funcionase bien, supongo que tendrías que copiar la imagen de ese buffer a otra textura y utilizar la dirección de memoria de esa copia en este parámetro. Hay un ejemplo de como copiar efectivamente los pixeles de la RenderTexture en la pregunta de StackOverflow que enlacé más arriba.

De todas formas nunca he hecho esto. Ya contarás, ¡ánimo!.

 

 

Edited by J Montes

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...