Android Code Snippet: Augmented Reality y la Apertura de la cámara


Estáis desarrollando una app de realidad aumentada, probablemente tengáis un SurfaceView para la cámara y otro sobre el anterior para los objetos y la información propia de vuestra realidad aumentada.

Probablemente situéis los objetos utilizando el GPS y los sensores de orientación con respecto al dispositivo móvil, pero claro: ¿dónde pintáis las cosas?

Con pápel, lápiz y un poco de trigonometría, rápidamente os dais cuenta que os falta un parámetro: el ángulo de visión de la cámara (Wikipedia), el cual es un parámetro bastante complejo de calcular y que además depende de "otros" factores que tampoco conocéis.





¡No desesperemos y seamos prácticos!

En primer lugar el ángulo de visión depende del zoom, eso es evidente así como lo es que si no necesitáis hacer uso del mismo mejor.

En segundo lugar estamos hablando de una lente estándar, por lo cual su ángulo de apertura estará aproximadamente definido entre 25º y 50º, siendo lo más común en los dispositivos unos 45º (//TODO: poner fuentes de estos datos).

Para complicarlo un poco más el ángulo de visión horizontal puede ser diferente (y de hecho suele serlo) al vertical.

¿Y cuáles son las opciones?

  1. La clase Camera.Parameters (accesible a través del método de instancia getParameters() ), contiene dos métodos para obtener estos dos ángulos (getHorizontalViewAngle() y getVerticalViewAngle() ). Google obliga a los fabricantes de móvil a proporcionar un valor que es el que devuelven estos métodos, pero paradójicamente, este valor no tiene por qué ser cierto, y de hecho suele ser una constante.
  2. En ciertas aplicaciones (por ejemplo para medir objetos reales), se puede idear algún tipo de procedimiento para calcular el ángulo de visión del dispositivo móvil en concreto (por ejemplo a partir de una fotografía y varios puntos conocidos).
  3. La opción rápida es comprobar el valor que devuelve el método 1 y si estos valores no tienen sentido hacer una aproximación. La que utilizo en el juego ¿Dónde está la mosca? es 40º para el ángulo horizontal y 50º para el vertical.

4 comentarios:

  1. Muchisimas Gracias!!! No se que haria sin vosotros... estaba utilizando un 60 horizontal y me parecia mucho...

    ResponderEliminar
  2. Respuestas
    1. Jaja, es complicado, hace tiempo hice unas pruebas y recuerdo que algunos fabricantes lo tenían "hardcoded" pasando del Zoom y de que coincidan el vertical y el horizontal lo cual es bastante raro. Pero claro, justificarlo adecuadamente exige un //TODO.

      Por si sirve de algo, hay más personas que lo han detectado: http://stackoverflow.com/questions/7983444/how-to-find-out-the-aperture-angle-of-an-android-camera

      Eliminar