2011-02-02 12 views
8

Estoy haciendo un proyecto para encontrar la velocidad de un vehículo a partir de las imágenes. Estamos tomando estas imágenes desde el interior del vehículo. Marcaremos un objeto de la primera imagen como referencia. Usando las propiedades del mismo objeto en la siguiente imagen, debemos calcular la velocidad del vehículo en movimiento. ¿¿¿Me puede ayudar alguien??? Estoy usando python opencv. He tenido éxito hasta encontrar el pixel marcado en la 2da imagen usando el método de flujo óptico. ¿Alguien puede ayudarme con el resto?Buscar la velocidad del vehículo a partir de las imágenes

+0

¿No sería esto también altamente dependiente de la cámara utilizada para tomar imágenes? La velocidad del obturador también debe ser considerada. – darioo

+3

hay mucho que considerar: p. la distancia perpendicular del objeto marcado desde la línea de movimiento de su automóvil, el tiempo entre las 2 imágenes – mauris

+0

, probablemente debería proporcionar algún código para mostrar su proceso. Sin eso, será difícil para cualquier persona responder. –

Respuesta

10

Conociendo la frecuencia de adquisición, ahora debe encontrar la distancia entre las posiciones sucesivas del marcador.

Para encontrar esta distancia, le sugiero que calcule el pose del marcador para cada imagen. En términos generales, la "pose" es la matriz de transformación que expresa las coordenadas de un objeto con respecto a una cámara. Una vez que tenga esas coordenadas sucesivas, puede calcular la distancia y luego la velocidad.

La estimación de la posición es el proceso de calcular la posición y orientación de un objeto conocido 3D en relación con una cámara 2D. La pose resultante es la matriz de transformación que describe el referencial del objeto en el referencial de la cámara.

Pose description

OpenCV implementa un algoritmo de estimación de pose: Posit. El doc dice:

dado algunos puntos 3D (en objeto sistema de coordenadas) del objeto, en menos cuatro puntos no coplanares, su proyecciones 2D en la imagen de la , y la longitud focal de la correspondiente cámara, el algoritmo es capaz de estimar la pose del objeto.

Esto significa:

  1. Debe conocer la longitud focal de la cámara
  2. Debe conocer la geometría de su marcador
  3. Debe ser capaz de igualar cuatro saben puntos de su marcador en la imagen 2D

Puede que tenga que calcular la distancia focal de la cámara utilizando el calibration routines proporcionado por OpenCV. Creo que tienes los otros dos datos requeridos.

Editar:

// Algorithm example 

MarkerCoords = {Four coordinates of know 3D points} 

I1 = take 1st image 
F1 = focal(I1) 
MarkerPixels1 = {Matching pixels in I1} 
Pose1 = posit(MarkerCoords, MarkerPixels1, F1) 

I2 = take 2nd image 
F2 = focal(I2) 
MarkerPixels2 = {Matching pixels in I2 by optical flow} 
Pose2 = posit(MarkerCoords, MarkerPixels2, F2) 

o1 = origin_of_camera * Pose1 // Origin of camera is 
o2 = origin_of_camera * Pose2 // typically [0,0,0] 
dist = euclidean_distance(o1, o2) 
speed = dist/frequency 

Edición 2: "¿Cuál es la frecuencia de adquisición" (Respuestas a los comentarios)

Calcular la velocidad de su vehículo equivale a calcular la velocidad del marcador. (En el primer caso, el referencial es el marcador conectado a la tierra, en el segundo caso, el referencial es la cámara conectada al vehículo.) Esto se expresa por la siguiente ecuación:

speed = D/(t2-t1) 

Con:

  • D la distancia [o1 o2]
  • o1 la posición del marcador en el momento t1
  • o2 la posición del marcador en time t2

Puede recuperar el tiempo transcurrido extrayendo t1 y t2 desde los metadatos de sus fotos, o desde la adquisición de frecuencia de su dispositivo de imágenes: t2-t1 = T = 1/F.

"¿No será mejor marcar cosas simples como carteles? ¿Y si lo hacemos no podemos considerarlo como un objeto 2d?"

Esto no es posible con el algoritmo Posit (o con cualquier otro algoritmo de estimación de pose por lo que yo sé): requiere cuatro no coplanares puntos. Esto significa que no puede elegir un objeto 2D incrustado en un espacio tridimensional, debe elegir un objeto con cierta profundidad.

Por otro lado, puede usar una forma simple realmente, siempre que se trate de un volumen. (Un cubo, por ejemplo).

+0

Tengo una seria duda. Ya que tendremos la libertad de marcar objetos por nuestra cuenta, ¿no sería mejor marcar cosas simples como carteles (principalmente rectángulos en forma)? Y si lo hace, ¿podemos considerarlo como un objeto 2d? ¿Y cuál es la frecuencia de adquisición? Soy un poco nuevo en ese tipo de términos. –

+0

Y gracias por su valiosa respuesta. :) –

Cuestiones relacionadas