studio programacion para móviles libro edición desarrollo curso aplicaciones c++ opencv computer-vision photogrammetry

c++ - para - manual de programacion android pdf



¿Cómo puedo determinar la distancia desde un objeto en un video? (8)

Alguien por favor corrígeme si estoy equivocado, pero me parece que si simplemente vas a usar una sola cámara y simplemente confiar en una solución de software, cualquier proceso que pudieras hacer sería propenso a falsos positivos. Dudo mucho que haya algún procesamiento que pueda diferenciar entre los objetos que realmente están a la distancia percibida y los que solo parecen estar a esa distancia (como la "perspectiva forzada") en las películas.

¿Alguna posibilidad de que pueda agregar un sensor ultrasónico?

Tengo un archivo de video grabado desde el frente de un vehículo en movimiento. Voy a usar OpenCV para detección y reconocimiento de objetos, pero estoy atascado en un aspecto. ¿Cómo puedo determinar la distancia desde un objeto reconocido?

Puedo conocer mi velocidad actual y la posición GPS del mundo real, pero eso es todo. No puedo hacer ninguna suposición sobre el objeto que estoy rastreando. Estoy planeando usar esto para rastrear y seguir objetos sin colisionar con ellos. Idealmente, me gustaría usar estos datos para derivar la posición del mundo real del objeto, lo cual podría hacer si pudiera determinar la distancia desde la cámara al objeto.


Cuando tiene video en movimiento, puede usar paralaje temporal para determinar la distancia relativa de los objetos. Parallax: ( definition ).

El efecto sería el mismo que obtenemos con nuestros ojos lo que puede ganar la percepción de profundidad al mirar el mismo objeto desde ángulos ligeramente diferentes. Como te estás moviendo, puedes usar dos cuadros de video sucesivos para obtener un ángulo ligeramente diferente.

Usando cálculos de paralaje, puede determinar el tamaño relativo y la distancia de los objetos (relativos entre sí). Pero, si desea el tamaño y la distancia absolutos , necesitará un punto de referencia conocido.

También necesitará saber la velocidad y dirección que se está recorriendo (así como también la velocidad de cuadro de video) para hacer los cálculos. Es posible que pueda derivar la velocidad del vehículo utilizando los datos visuales, pero eso agrega otra dimensión de complejidad.

La tecnología ya existe Los satélites determinan la prominencia topográfica (altura) mediante la comparación de múltiples imágenes tomadas en un corto período de tiempo. Usamos paralaje para determinar la distancia de las estrellas tomando fotos del cielo nocturno en diferentes puntos de la órbita terrestre alrededor del sol. Pude crear imágenes 3-D desde la ventana de un avión tomando dos fotografías en una breve sucesión.

La tecnología y los cálculos exactos (incluso si los conocía de manera extravagante) están fuera del alcance de la discusión aquí. Si puedo encontrar una referencia decente, la publicaré aquí.


Dos cámaras para que puedas detectar paralaje. Es lo que hacen los humanos.

editar

Por favor, consulte la respuesta de Ravenspoint para obtener más detalles. Además, tenga en cuenta que una sola cámara con un divisor probablemente sea suficiente.


Necesita identificar los mismos puntos en el mismo objeto en dos marcos diferentes separados a una distancia conocida. Como conoce la ubicación de la cámara en cada cuadro, tiene una línea base (el vector entre las dos posiciones de la cámara. Construya un triángulo desde la línea base conocida y los ángulos con los puntos identificados. La trigonometría le da la longitud de los lados identificados las trayectorias para la longitud conocida de la línea de base y los ángulos conocidos entre la línea de base y los lados desconocidos.

Puede usar dos cámaras o una cámara para tomar fotografías sucesivas. Entonces, si su vehículo se mueve a 1 m / s y toma fames cada segundo, entonces los marcos de éxito le proporcionarán una línea de base de 1 m que debería ser buena para medir la distancia de objetos hasta, por ejemplo, 5 m de distancia. Si necesita distanciar objetos más lejos que los marcos utilizados, es necesario que estén más separados; sin embargo, los objetos más distantes estarán a la vista durante más tiempo.

El observador de F1 ve el objetivo en T con el ángulo a1 del vector de velocidad. El observador mueve la distancia b a F2. Ve el objetivo en T con el ángulo a2.

Se requiere para encontrar r1, rango de destino en F1

La identidad trigonométrica para el coseno da

Cos (90 - a1) = x / r1 = c1

Cos (90 - a2) = x / r2 = c2

Cos (a1) = (b + z) / r1 = c3

Cos (a2) = z / r2 = c4

x es la distancia al objetivo ortogonal al vector de velocidad del observador

z es la distancia de F2 a la intersección con x

Resolviendo para r1

r1 = b / (c3 - c1. c4 / c2)


Poner y objeto de tamaño conocido en el campo de visión de las cámaras. De esta forma, puede tener una métrica más objetiva para medir distancias angulares. Sin un segundo punto de vista / cámara, se limitará a estimar tamaño / distancia, pero al menos no será una suposición completa.


Tu problema es bastante estándar en el campo.

En primer lugar,

necesitas calibrar tu cámara Esto se puede hacer offline (hace la vida mucho más simple) o en online través de la autocalibración.

Calibrarlo fuera de línea - por favor.

En segundo lugar,

Una vez que tenga la matriz de calibración de la cámara K , determine la matriz de proyección de la cámara en una escena sucesiva (necesita usar paralaje como lo mencionaron otros). Esto se describe bien en este tutorial de OpenCV .

Tendrá que usar la información del GPS para encontrar la orientación relativa entre las cámaras en las escenas sucesivas (que pueden ser problemáticas debido al ruido inherente en la mayoría de las unidades de GPS), es decir, la R yt mencionadas en el tutorial o la rotación y traducción entre las dos cámaras.

Una vez que hayas resuelto todo eso, tendrás dos matrices de proyección: representaciones de las cámaras en esas escenas sucesivas. Usando una de estas llamadas matrices de cámara, puede "proyectar" un punto 3D M en la escena a la imagen 2D de la cámara en una coordenada de píxel m (como en el tutorial).

Usaremos esto para triangular el punto 3D real de los puntos 2D encontrados en su video.

En tercer lugar,

utilice un detector de puntos de interés para rastrear el mismo punto en su video que se encuentra en el objeto de interés. Hay varios detectores disponibles, recomiendo SURF ya que tiene OpenCV que también tiene varios otros detectores como esquinas Shi-Tomasi , Harris , etc

Por cuartos,

Una vez que ha rastreado los puntos de su objeto a lo largo de la secuencia y obtenido las coordenadas de píxel 2D correspondientes, debe triangulate para obtener el mejor punto 3D dado su matriz de proyección y sus puntos 2D.

La imagen de arriba captura muy bien la incertidumbre y cómo se calcula un punto 3D que mejor se ajusta. Por supuesto, en su caso, ¡las cámaras probablemente estén una frente a la otra!

Finalmente,

Una vez que haya obtenido los puntos 3D en el objeto, puede calcular fácilmente la distancia euclidiana entre el centro de la cámara (que es el origen en la mayoría de los casos) y el punto.

Nota

Obviamente, esto no es fácil, pero tampoco es tan difícil. Recomiendo el excelente libro de Hartley y Zisserman, Multiple View Geometry, que describe todo lo de arriba en detalle con el código de MATLAB para arrancar.

¡Diviértete y sigue haciendo preguntas!


primero debe calibrar su cámara para poder obtener la relación entre las posiciones de los objetos en el plano de la cámara y sus posiciones en el plano del mundo real, si está usando una cámara, puede usar la "técnica de flujo óptico" si está utilizando dos cámaras solo usas una triangulación simple para encontrar la posición real (será fácil encontrar la distancia de los objetos) pero el probem con este segundo método es la coincidencia, lo que significa que puedes encontrar la posición de un objeto ''x'' en la cámara2 si ya conoce su posición en la cámara1 y aquí puede usar el algoritmo ''SIFT''. Acabo de darte algunas palabras clave desearía que te pudiera ayudar.


usa mapas de disparidad estéreo muchas implementaciones están a flote, aquí hay algunos enlaces: http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT11/node4.html

http://www.ece.ucsb.edu/~manj/ece181bS04/L14(morestereo).pdf

En su caso, no tiene cámara estéreo, pero la profundidad se puede evaluar utilizando el video http://www.springerlink.com/content/g0n11713444148l2/

Creo que lo anterior será lo que podría ayudarte más.

la investigación ha progresado hasta el momento en que la profundidad puede evaluarse (aunque no en una extensión satisfactoria) desde una única imagen monocular http://www.cs.cornell.edu/~asaxena/learningdepth/