He capturado posiciones de automóviles en diferentes cuadros del video . Suponga que el centroide del automóvil (por ejemplo, el automóvil del lado izquierdo que viene hacia nosotros en las imágenes) en el cuadro de video1 es P (x1, y1) y Q (x2, y2) en el cuadro de video4.
¿Es posible representar los puntos P y Q en 3D? para poder calcular la distancia correcta de píxeles d (PQ) y finalmente calcular la distancia real
Nota: puede suponer que la cámara está estacionaria, colocada a una altura de 10 m del nivel del suelo. También puede asumir cualquier dato adecuado si lo desea, también puede consultar la siguiente figura.
Respuestas:
[EDITADO] Así es como se hace.
Pasos: 1. Aislar la parte del divisor de carreteras.
Luego, usando Houghlines, encuentre las líneas más largas en Image. Descubra los puntos extremos que cruzan el límite de la imagen. Tienes los puntos cuadilaterales. Me salté esta parte al elegirlos manualmente. En mi caso, el ancho del camino en la parte superior de la imagen es 10, y en la parte inferior es 60.
Ahora, para el Destino, tenemos que Image para que Divider Quadilateral tenga un ancho uniforme de 60, por lo que guardamos en otra matriz nuevos puntos, que tienen los mismos puntos inferiores, pero los puntos superiores se modifican ya que forman un rectángulo con una altura igual a la imagen (o más grande, puede ajustarlo según le convenga después de ejecutarlo una vez y ver los resultados), pero ancho 60. Recuerde, estamos transformando nuestra imagen de manera que el divisor encaje en esta Área Rectangular. La imagen cambiará automáticamente.
Ahora, usando
Mat TransformMat = getPerspectiveTransform(ipPts, opPts);
de opencv en los puntos cuadráticos iniciales y de destino, obtenemos una matriz de transformación, que aplicamos a nuestra imagen de prueba.
warpPerspective(ipImg, opImg, TransformMat, ipImg.size());
Verá que se recorta una gran cantidad de área para que se ajuste a la salida en Tamaño de imagen de entrada. Sin embargo, notará que la imagen se transforma para obtener un divisor paralelo, como esperábamos. Al realizar algunas traducciones y cosas, y tomar una imagen de salida de mayor tamaño, obtendrá esto. Nunca podemos obtener una imagen de salida perfectamente envuelta, ya que su tamaño puede ser muy grande. Pero llegaremos a alguna restricción que cumplirá nuestra tarea. Aquí está la última imagen:
fuente
Esto parece una especie de problema de trazado de rayos . Si conoce la posición y orientación de su cámara, debería poder calcular la matriz de proyección 3x4 y su inversa.
Esto debería permitirle convertir puntos de imagen a la posición 3D (en la carretera). Esta discusión http://opencv-users.1802565.n2.nabble.com/2D-to-3D-projection-with-given-plane-td7272428.html podría tener más información útil.
En cuanto a aplicarlo en matlab. Hay un affine3d que puede usar para almacenar la transformación. También puede haber cosas útiles para proyecciones / trazado de rayos en el intercambio de archivos, como http://www.mathworks.com/matlabcentral/fileexchange/25974-raytracer, pero no he buscado en detalle para encontrar qué es relevante para qué usted quiere.
fuente
Si puede calibrar su cámara y puede detectar algunos puntos de referencia en la superficie de la carretera, puede obtener coordenadas 3D de los puntos de imagen que están en la carretera. Esto supone que el camino está en un avión. En otras palabras, si puede detectar un automóvil, puede calcular las coordenadas 3D de la parte inferior del automóvil. Vea este ejemplo en MATLAB usando el Computer Vision System Toolbox.
fuente