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.
- ¿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).
- ¿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?
Olvidé mencionar que mi cuerpo de calibración es un patrón de cuadrícula circular, no el típico tablero de ajedrez. –