2012-06-30 8 views
6

Tengo un conjunto de imágenes de un cuerpo rígido con algunos marcadores adjuntos. Definí un sistema de coordenadas con origen en uno de estos marcadores y quiero obtener la rotación y la traducción entre este sistema de coordenadas y el definido en el origen de la cámara.Calibración de la cámara (OpenCV 2.3): cómo utilizar los parámetros de distorsión?

Intenté durante algún tiempo POSIT (después de this) sin obtener resultados aceptables, hasta que me di cuenta de que tenía que calibrar la cámara en primer lugar. Basado en this y usando algunas imágenes adquiridas con un cuerpo de calibración, obtuve la matriz intrínseca de la cámara y los parámetros de distorsión. También recibí un error de re-proyección malo (?) De 1.276.

  1. ¿El error de re-proyección es demasiado alto? ¿Cómo puedo mejorarlo? (Utilicé más imágenes y solo logré una ligera disminución del valor).
  2. ¿Puedo utilizar los parámetros de distorsión en POSIT? ¿Cómo?

Gracias.


Parece que la única manera de conseguir una disminución en el error de reproyección (que cambia de ~ 1,3 a ~ 0,7) es mediante el establecimiento de '0' los siguientes parámetros en el archivo de configuración XML:

<Calibrate_FixAspectRatio> 0 </Calibrate_FixAspectRatio> 
<Calibrate_AssumeZeroTangentialDistortion> 0 </Calibrate_AssumeZeroTangentialDistortion> 
<Calibrate_FixPrincipalPointAtTheCenter> 0 </Calibrate_FixPrincipalPointAtTheCenter> 

Usar más imágenes no cambia el error y todavía no estoy seguro de si este nuevo error es aceptable o no.

Utilicé los valores que dio la calibración como salida (es decir, la distancia focal y el centro óptico) en POSIT pero los resultados fueron muy similares a los que obtuve cuando estaba usando valores de precalibración. No utilicé los parámetros de distorsión porque no sé cómo manejarlos en POSIT (¿podrían hacer una diferencia en los resultados?).

La matriz de la cámara llegué después de la calibración:

<Camera_Matrix type_id="opencv-matrix"> 
<rows>3</rows> 
<cols>3</cols> 
<dt>d</dt> 
<data> 
2.0613885351075501e+003 0. 2.2865517805186334e+002 0. 
2.2546461307897816e+003 2.5261706201677623e+002 0. 0. 1. 
</data> 
</Camera_Matrix> 

y la forma en que lo usé en POSIC:

#define FOCAL_LENGTH 2158.0175 
#define FOCAL_LENGTH_X 2061.389 
#define FOCAL_LENGTH_Y 2254.646 
#define cX 203.655 
#define cY 205.117 

He calculado la diferencia entre el nuevo centro de coordenadas y la otra para el las imágenes de calibración y luego aplicaron esa diferencia en las coordenadas centrales de las imágenes en las que estoy trabajando con POSIT.

Estoy usando POSIT en dos imágenes diferentes donde teóricamente debería obtener una rotación de 0 (para el primero) y 10 (para el segundo) grados entre el modelo y el sistema de coordenadas de la cámara. Después de obtener la matriz de rotación para cada imagen, definí un vector unitario en el sistema de coordenadas de la cámara y lo calculé en el sistema de coordenadas del modelo multiplicándolo por el inverso de las dos matrices de rotación dadas por POSIT, obteniendo dos vectores nuevos en el modelo sistema coordinado. Cuando calculo el ángulo entre estos dos vectores en el sistema de coordenadas del modelo, la salida no es como debería ser, 10 grados.

¿Alguien tiene una idea de dónde me estoy equivocando?

+0

Olvidé mencionar que mi cuerpo de calibración es un patrón de cuadrícula circular, no el típico tablero de ajedrez. –

Respuesta

2

¿Cuál es la resolución de la imagen? El punto principal debe estar cerca del centro de la imagen. ¿Cuál es la distancia focal de la lente? Ese error de calibración podría estar bien dependiendo de la precisión que necesite. Para evitar el error introducido por la distorsión de la lente, debe distorsionar los puntos de imagen pasados ​​a POSIT usando undistortPoints.¿Qué tan grande es este error depende de qué tan grande es la distorsión de su lente.

+0

No tengo ninguna información con respecto a la resolución de la imagen ni a la distancia focal; por eso hice la calibración. Desde la matriz de la cámara obtengo la distancia focal en xey, y el punto principal de la imagen (está cerca del centro de la imagen). ¿Mi lógica está equivocada? –

+0

La resolución de la imagen es el ancho y alto de sus imágenes. Debe conocer la distancia focal real de su lente (8 mm, 16 mm, ...). La resolución de la imagen y la distancia focal real determinan el valor de la distancia focal que debe estimarse con el proceso de calibración. Por cierto, ¿no deberían cX y cY ser 228.655 y 252.617? –

+0

Acabo de recibirlo. Estaba haciendo un etiquetado incorrecto de los puntos de la imagen, no pude detectarlo antes. Gracias por tu ayuda Javier! –

Cuestiones relacionadas