¿Cómo calcular una distancia específica dentro de una imagen?

Perdón por mi mal ingles. Tengo el siguiente problema:

1

Digamos que la cámara de mi dispositivo móvil está mostrando esta imagen.

En la imagen se pueden ver 4 posiciones diferentes. Cada posición me es conocida (longitud, latitud).

Ahora quiero saber, donde en la imagen una posición específica es. Por ejemplo, quiero tener un rectángulo de 20 metros en frente y 5 metros a la izquierda de mí. Sólo sé la latitud / longitud de este punto, pero no sé, donde tengo que colocarlo dentro de la imagen (x, y). Por ejemplo, POS3 está en (0,400) en mi opinión. POS4 está en (600.400) y así sucesivamente.

¿Dónde tengo que poner el nuevo punto, que es 20 metros en frente y 5 metros a la izquierda de mí? (Así que mi entrada es: (LatXY, LonXY) y mi resultado debe ser (x, y) en la pantalla)

También obtuve la altura de la cámara y los ángulos de los ejes x, y y z de la cámara.

¿Puedo usar operaciones matemáticas simples para resolver este problema?

¡Muchas gracias!

La respuesta que desee dependerá de la precisión del resultado que necesite. Como señaló danaid, la no linealidad en el sensor de imagen y otros factores, como la distorsión atmosférica, pueden inducir errores, pero serían problemas difíciles de resolver con diferentes cámaras, etc., en diferentes dispositivos. Así que vamos a empezar por obtener una aproximación razonable que se puede ajustar a medida que más precisión se necesita.

En primer lugar, es posible que pueda ignorar la información direccional del dispositivo, si así lo desea. Si tiene las cinco ubicaciones, (POS1 – POS4 y cámara, en un conjunto de coordenadas coherentes, tiene todo lo que necesita. De hecho, ni siquiera necesita todos esos puntos.

Una nota sobre coordenadas coherentes. En su escala, una vez que utilice el convertir el lat y largo a metros, usando cos (lat) para su factor de escala, usted debe ser capaz de tratar a todos desde una perspectiva de "tierra plana". Entonces sólo tiene que recordar que el plano xy de la cámara es aproximadamente el plano xz global.

Antecedentes conceptuales El siguiente diagrama presenta la proyección de los puntos sobre el plano de la imagen. El dz utilizado para la perspectiva se puede derivar directamente usando la proporción de la distancia en la vista entre puntos lejanos y puntos cercanos, contra su distancia física. En el caso simple en el que la lınea POS1 a POS2 es paralela a la lınea POS3 a POS4, el factor de perspectiva es justamente la relación de escalamiento de las dos lıneas:

Scale (POS1, POS2) = pixel distance (pos1, pos2) / Physical distance (POS1, POS2) Scale (POS3, POS4) = pixel distance (pos3, pos4) / Physical distance (POS3, POS4) Perspective factor = Scale (POS3, POS4) / Scale (POS1, POS2) 

Así que el factor de perspectiva a aplicar a un vértice de su rect sería la proporción de la distancia al vértice entre las líneas. Simplificación:

 Factor(rect) ~= [(Rect.z - (POS3, POS4).z / ((POS1, POS2).z - (POS3, POS4).z)] * Perspective factor. 

Responder

Una transformación en perspectiva es lineal con respecto a la distancia desde el punto focal en la dirección de la vista. El diagrama siguiente se dibuja con el eje X paralelo al plano de la imagen y el eje Y apuntando en la dirección de la vista. En este sistema de coordenadas, para cualquier punto P y un plano de imagen a cualquier distancia desde el origen, el punto proyectado p tiene una coordenada X px que es proporcional a Px / Py. Estos valores pueden interpolarse linealmente.

En el diagrama, tp es la proyección deseada del punto objetivo. Para obtener tp.x, interpolar entre, por ejemplo, pos1.x y pos3.x utilizando ajustes para la distancia, como sigue:

 tp.x = pos1.x + ((pos3.x-pos1.x)*((TP.x/TP.y)-(POS1.x/POS1.y))/((POS3.x/POS3.y)-(POS1.x/POS1.y)) 

La ventaja de este enfoque es que no requiere ningún conocimiento previo del ángulo visto por cada píxel, y será relativamente robusto contra errores razonables en la ubicación y orientación de la cámara.

Refinamiento adicional

El uso de más datos significa que se pueden compensar más errores. Con múltiples puntos de vista, la ubicación y orientación de la cámara se pueden calibrar con el método Tienstra . Una prueba concisa de este enfoque, (utilizando coordenadas barycéntricas), se puede encontrar aquí .

Dado que las transformaciones requeridas son todas lineales basadas en coordenadas homogéneas, se pueden aplicar coordenadas barycéntricas para interpolar basándose en tres o más puntos, dadas sus coordenadas X, Y, Z, W en un espacio homogéneo de 3 y sus coordenadas (x, y) En el espacio de la imagen. Cuanto más cerca estén los puntos del punto de destino, menos significativas serán las no linealidades, por lo que en su ejemplo utilizaría POS 1 y POS3, ya que el rect está a la izquierda y POS2 o POS4 dependiendo de la distancia relativa .

(Las coordenadas bari céntricas son probablemente las más conocidas como el método utilizado para interpolar los colores en un triángulo (fragmento) en gráficos 3D).

Editar: Las coordenadas bariéntricas todavía requieren el factor de coordenadas homogéneas W, que es otra forma de expresar la corrección de perspectiva para la distancia desde el punto focal. Vea este artículo en GameDev para más detalles.

Dos preguntas SO relacionadas: corrección de perspectiva de las coordenadas de textura en 3D y cartografía de textura de coordenadas baricentricas . Este diagrama puede ayudar a explicar la interpolación de coordenadas de imagen basadas en coordenadas globales

Veo un par de problemas.

El único error real es que usted está escalando su proyección por _canvasWidth / 2 etc en lugar de traducir que lejos del punto principal – agregar los valores al resultado proyectado, la multiplicación es como "zoom" que en la proyección.

Segundo, ocuparse de un espacio de coordenadas cartesiano global es una mala idea. Con las fórmulas que estás usando, la diferencia entre (60.1234, 20.122) y (60.1235, 20.122) (es decir, una pequeña diferencia de la latitud) causa cambios de magnitud similar en todos los 3 ejes que no se sienten bien.

Es más sencillo adoptar el mismo enfoque que los gráficos por ordenador: configure la cámara como origen de su "espacio de cámara" y convierta entre objetos del mundo y el espacio de la cámara obteniendo la distancia entre la ubicación de la cámara y la ubicación de la cámara. el objeto. Vea aquí: http://www.movable-type.co.uk/scripts/latlong.html

En tercer lugar, sus cálculos de proyección de perspectiva son para una cámara de agujero de alfiler ideal, que probablemente no tienen. Sólo será una pequeña corrección, pero para ser exactos es necesario averiguar cómo aplicar adicionalmente la proyección que corresponde a los parámetros de la cámara intrínseca de su cámara. Hay dos maneras de lograr esto: puedes hacerlo como una multiplicación posterior al esquema que ya tienes, o puedes cambiar de multiplicar por una matriz 3×3 a usar una matriz completa de cámara 4×4: http://en.wikipedia.org / Wiki / Camera_matrix con los parámetros allí.

Usando este enfoque, la proyección de perspectiva es simétrica sobre el origen – si no comprueba la profundidad z, proyectará los puntos detrás de usted en la pantalla como si estuvieran a la misma distancia z delante de usted.

Entonces por último no estoy seguro acerca de las APIs de Android, pero asegúrese de que está recibiendo el norte verdadero y no teniendo norte magnético. Alguna plataforma devuelve dependiendo de un argumento o configuración. (Y sus grados son en radianes si eso es lo que las API quieren etc – cosas tontas, pero he perdido horas de depuración menos :)).

Si conoce los puntos en el marco de la cámara y las coordenadas del mundo real, bastará con un álgebra lineal simple. Un paquete como OpenCV tendrá este tipo de funcionalidad, o alternativamente puede crear las matrices de proyección usted mismo:

http://en.wikipedia.org/wiki/3D_projection

Una vez que usted tiene un conjunto de puntos es tan simple como rellenar algunos vectores para resolver el sistema de ecuaciones. Esto le dará una matriz de proyección. Una vez que tenga una matriz de proyección, puede suponer que los 4 puntos son planos. Multiplique cualquier coordenada 3D para encontrar la coordenada de plano de imagen 2D correspondiente.

  • ¿Cómo mejorar la precisión de los sensores de acelerómetro y brújula?
  • Android: Qualcomm QCAR (Vuforia) SDK con min3D Framework (u otro 3D-Model / Animation Loader / Renderer)
  • Obtener coordenadas de pantalla por ubicación específica y longitud (android)
  • ¿Cómo hacer clics en parte del modelo en Vuforia (sin Unity)?
  • Realidad aumentada (AR) en HTML5 y WebGL
  • Dónde empezar con Realidad Aumentada
  • Ayuda para rectificar escalas de línea en Android OpenGL 2.0 con RQAR
  • Reconocimiento y seguimiento de objetos en movimiento más rápido en Android
  • ¿Es posible utilizar la realidad aumentada en interiores sin GPS?
  • La dirección de la brújula es diferente dependiendo de la orientación del teléfono
  • Integre la vista Unity3d en la actividad de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.