2012-06-11 12 views
6

Quiero aumentar un objeto virtual en x, y, z metros wrt cámara. OpenCV tiene funciones de calibración de cámara, pero no entiendo exactamente cómo puedo dar coordenadas en metros¿Cómo encontrar la matriz de la cámara para la realidad aumentada?

Intenté simular una cámara en Unity pero no obtuve el resultado esperado.

Configuro la matriz de proyección de la siguiente manera y creo un cubo de unidad en z = 2.415 + 0.5. Donde 2.415 es la distancia entre el ojo y el plano de proyección (modelo de cámara estenopeica) Dado que la cara del cubo está en el plano de recorte frontal y su dimensión es unidad, ¿no debería cubrir toda la ventana gráfica?

Matrix4x4 m = new Matrix4x4(); 
    m[0, 0] = 1; 
    m[0, 1] = 0; 
    m[0, 2] = 0; 
    m[0, 3] = 0; 

    m[1, 0] = 0; 
    m[1, 1] = 1; 
    m[1, 2] = 0; 
    m[1, 3] = 0; 

m[2, 0] = 0; 
    m[2, 1] = 0; 
    m[2, 2] = -0.01f; 
    m[2, 3] = 0; 

    m[3, 0] = 0; 
    m[3, 1] = 0; 
    m[3, 2] = -2.415f; 
    m[3, 3] = 0; 
+0

Si configura m [3,2] = -1/2.415f ym [3,3] = 1 la matriz de proyección funciona correctamente –

Respuesta

4

Terminé midiendo el campo de visión manualmente. Una vez que conozca FOV, puede crear fácilmente la matriz de proyección. No hay necesidad de preocuparse por las unidades porque al final la proyección es de la forma (X * d/Z, Y * d/Z). Cualquiera que sean las unidades de X, Y, Z puede ser la relación de X/Z sigue siendo la misma.

5

La escala global de su calibración (es decir, las unidades de medida de coordenadas del espacio 3D) se determina por la geometría del objeto de calibración que utiliza. Por ejemplo, cuando calibra en OpenCV usando imágenes de un tablero plano, las entradas al procedimiento de calibración son pares correspondientes (P, p) de puntos 3D P y sus imágenes p, las coordenadas (X, Y, Z) del 3D los puntos se expresan en mm, cm, pulgadas, millas, lo que sea, según lo requiera el tamaño del objetivo que uses (y la óptica que lo represente), y las coordenadas 2D de las imágenes estén en píxeles. La salida de la rutina de calibración es el conjunto de parámetros (las componentes de la matriz de proyección P y los parámetros de distorsión no lineal k) que "convierten" las coordenadas tridimensionales expresadas en esas unidades métricas en píxeles.

Si no conoce (o no quiere usar) las dimensiones reales del objetivo de calibración, puede modificarlas pero no modificarlas (para que, por ejemplo, un cuadrado siga siendo un cuadrado incluso) aunque la longitud verdadera de su lado puede ser desconocida). En este caso, su calibración se determinará hasta una escala global desconocida. Este es realmente el caso común: en la mayoría de las aplicaciones de realidad virtual, realmente no te importa cuál es la escala global, siempre y cuando los resultados se vean correctos en la imagen.

Por ejemplo, si desea agregar un par de labios 3D aún más esponjosos en un video de Angelina Jolie, y compárelos con el video original para que los nuevos labios falsos permanezcan unidos y se vean "naturales" en la cara , solo necesita volver a escalar el modelo 3D de los labios falsos para que se solape correctamente con la imagen de los labios. Si el modelo está a 1 metro o una milla de distancia de la cámara CG en la que renderizas el compuesto es completamente irrelevante.

+1

Me gusta el ejemplo :) – Ani

+1

Puedo aumentar los modelos sin la escala adecuada pero quiero que sea exacto en metros. Haré renderizado estéreo y debe dar una percepción de profundidad exacta. –

+0

La precisión métrica es irrelevante en la carcasa de reproducción estéreo también: lo único que importa en este caso es renderizar con la cantidad correcta de disparidad izquierda-derecha en las dos cámaras. Mientras que todas las proporciones de tamaño y distancia sean correctas, no se podrá percibir la escala global real. –

5

Para encontrar el aumento de un objeto necesita encontrar la pose y orientación de la cámara. Eso es lo mismo que encontrar la cámara extrínseca. También debe calcular primero los intrínsecos de la cámara (que se llama calibraiton).

OpenCV le permite hacer todo esto, pero no es trivial, requiere trabajo por su cuenta. Te doy una pista, primero necesitas reconocer algo en la escena que sabes cómo se ve, para que puedas calcular la pose de la cámara analizando este objeto, llámalo un marcador. Puede comenzar por los fiduciales típicos, son fáciles de detectar.

Echa un vistazo a este thread.

Cuestiones relacionadas