Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 44,01€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
crmancera

Guardar foto de cámara con zoom

Recommended Posts

Buenas noches! Después de un par de años sin desarrollar nada en Unity, me he puesto manos a la obra con un nuevo proyecto para Android. Me he atascado en el siguiente punto, a ver si podéis echarme un cable. 

En una de las escenas se puede hacer una foto desde la cámara del móvil. Para ello utilizo la WebCamTexture de Unity. Tras ello utilizo un Renderer para aplicarle Zoom a la imagen captada. Por último utilizo una nueva variable de tipo Texture2D para guardarlo como imagen .png en el dispositivo. El problema es que aunque haya aplicado el Zoom en el Renderer (en el código) la imagen .png se guarda sin zoom. ¿Cómo podría guardar la imagen con el zoom aplicado? Adjunto unas imágenes para que se entienda mejor lo que explico. Muchas gracias!!!!

 

camera_renderer.material.SetTextureScale("_MainTex", new Vector2(camera_zoom, camera_zoom));
camera_renderer.material.SetTextureOffset("_MainTex", new Vector2((1 - camera_zoom) / 2, (1 - camera_zoom) / 2));
camera_texture.SetPixels(backCam.GetPixels());
camera_texture.Apply();
     
backCam.Pause();
     
snap = camera_texture;

 

 

Imagen con el zoom antes de guardar.

take_photo.PNG

 

La misma imagen una vez guardada en el dispositivo. Se ha guardado sin Zoom.

load_photo.PNG

Edited by crmancera

Share this post


Link to post
Share on other sites

No sé, no te puedo decir exactamente si estoy en lo cierto o no pero voy a probar suerte 

camera_renderer.material.SetTextureScale("_MainTex", new Vector2(camera_zoom, camera_zoom));
camera_renderer.material.SetTextureOffset("_MainTex", new Vector2((1 - camera_zoom) / 2, (1 - camera_zoom) / 2));
camera_texture.SetPixels(backCam.GetPixels());
camera_texture.Apply();
     
backCam.Pause();
     
snap = camera_renderer;  //cambié esta parte

Lo más seguro que esté mal, llevo sin tocar código siglos. 

Share this post


Link to post
Share on other sites

No me vale, ya que snap es de tipo Texture2D y camera_renderer de tipo Renderer. Gracias igualmente! He estado investigando y he descubierto la librería Vuforia, que parece que se utiliza para  Realidad Aumentada, quizás me sirva, y tiene muchas más opciones para la cámara. Ya os contaré.

Share this post


Link to post
Share on other sites

He cambiado todo lo que tenía hecho con la cámara de Unity por Vuforia. Y los resultados son más que satisfactorios. Esta librería permite el autoenfoque de la cámara y el uso del flash. La parte mala es que hace la aplicación más pesada porque incluye todo lo necesario para la realidad aumentada, y no sé cuanto podré aligerar la librería. No he encontrado ninguna forma de hacer la foto con esta librería, así que finalmente lo implementaré mediante una captura de pantalla, que para lo que quiero hacer me vale.

Share this post


Link to post
Share on other sites

La API de Vuforia no tiene contemplada las capturas del stream de video. Tambien tienes que tener en cuenta que la versión de pago es cara, hay otras soluciones de RA, lo digo porque la versión que no es de pago, te planta la marca de agua y si guardas una captura de pantalla, la marca de agua se va a quedar y pagar una licencia básica, que anda por los 500 € solo para usar la cámara, pues no se si es rentable, pero desde luego es caro.

Igual con el Unity AR Foundation que te soporta por debajo ARCore y ARKit  haces lo mismo, aunque no vale para dispositivos mas antiguos.

Mira el estado de ARToolkit, hace mas de un año que no lo uso, era gratuito y funcionaba muy bien.

Y mira tambien Wikitude

Te pongo soluciones AR porque parece que la cámara AR es lo que te soluciona el problema, pero igualmente, estas aplicaciones te van a cargar mucho la app, tanto en peso, como en rendimiento, esto funciona con una tecnología llamada VIO, (Odometría Visual con Inercia), que analiza la imagen que graba la cámara, cuanto mas fotogramas mejor, captura puntos de referencia, esta nube de puntos, la asocia a los datos del giroscopio y en su caso, del GPS y todo esto lo compara con lo mismo en el siguiente fotograma y así posiciona los objetos en su sitio y te los muestren distinta posición según te mueves.

Por eso, cuanto mas potente es la máquina, mejor es el sensor CMOS de la cámara y mejores son las condiciones de luz, mejor funciona el sistema. 

Por lo que dices no vas a usar nada de esto, pero la app lo va a hacer igualmente en el momento que pones una camara AR y visualizas un objeto con esa cámara, así que imagina el consumo y la bajada de rendimiento que va a tener esa app, aunque también es cierto que no es lo mismo intentar escanear un marcador que mantener objetos 3D en pantalla (aunque esto ultimo lo pongo pensando exclusivamente en Vuforia). Tenlo en cuenta si además tiene que hacer otras cosas, porque puede empezar a ir a paso de tortuga antes de lo que imaginas.
 

Share this post


Link to post
Share on other sites

Hola FNP! Creo que hace poco cambiaron la política sobre las licencias de Vuforia. Te permiten utilizar el Ground Plane, Device Tracker y Stereo Rendering (https://forum.unity.com/threads/discussing-the-fee-tier.511689/)sin marca de agua . Si no pones la clave de licencia no aparece la marca de agua, así que este problema se solucionaría. Lo que sí es cierto es que debo evaluar el tema del peso de la librería completa de Vuforia. Hasta ahora lo he probado con un par de móviles antiguos (con 1 y 2 gigas  de ram) y el rendimiento ha sido fluido. Pero en memoria... Son unos 30 megas más, preguntaré por el foro de Vuforia, a ver que puedo eliminar. Por cierto, muy interesante el tema de AR, me lo has explicado muy sencillo de entender, realmente no conocía el procesado que hay por detrás.

Share this post


Link to post
Share on other sites

×