2012-04-17 19 views
5

Estoy tratando de hacer la calibración de la cámara Kinect y la cámara externa, con Emgu/OpenCV. Estoy atascado y realmente agradecería cualquier ayuda.Rectificación de cámaras no calibradas, a través de la matriz fundamental

He elegido hacer esto a través de la matriz fundamental, es decir, la geometría epipolar. Pero el resultado no es el esperado. Las imágenes de resultados son negras o no tienen ningún sentido. Los puntos Mapx y Mapy son generalmente todos iguales a infinito o infinito, o todos son iguales a 0.00 y rara vez tienen valores regulares.

Esta es la forma en que traté de hacer la rectificación:

1.) puntos de imagen Búsqueda obtienen dos conjuntos de puntos de imagen (uno por cada cámara) del conjunto de imágenes. He hecho esto con el tablero de ajedrez y la función FindChessboardCorners.

2.) Encuentra matriz fundamental

CvInvoke.cvFindFundamentalMat(points1Matrix, points2Matrix, 
_fundamentalMatrix.Ptr, CV_FM.CV_FM_RANSAC,1.0, 0.99, IntPtr.Zero); 

puedo pasar todos los puntos recogidos de todo el conjunto de imágenes, o simplemente a partir de dos imágenes que tratan de rectificar?

3.) matrices Búsqueda homográficos

CvInvoke.cvStereoRectifyUncalibrated(points11Matrix, points21Matrix, 
_fundamentalMatrix.Ptr, Size, h1.Ptr, h2.Ptr, threshold); 

4.) Get MapX y mapy

double scale = 0.02; 
CvInvoke.cvInvert(_M1.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU); 

CvInvoke.cvMul(_H1.Ptr, _M1.Ptr, _R1.Ptr,scale); 
CvInvoke.cvMul(_iM.Ptr, _R1.Ptr, _R1.Ptr, scale); 
CvInvoke.cvInvert(_M2.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU); 
CvInvoke.cvMul(_H2.Ptr, _M2.Ptr, _R2.Ptr, scale); 
CvInvoke.cvMul(_iM.Ptr, _R2.Ptr, _R2.Ptr, scale); 

CvInvoke.cvInitUndistortRectifyMap(_M1.Ptr,_D1.Ptr, _R1.Ptr, _M1.Ptr, 
mapxLeft.Ptr, mapyLeft.Ptr) ; 

Tengo un problema aquí ... ya no estoy usando tarada imágenes, ¿cuál es la matriz de mi cámara y los coeficientes de distorsión? ¿Cómo puedo obtenerlo de las matrices fundamentales de matriz o de homografía?

5.) Reasignar

CvInvoke.cvRemap(src.Ptr, destRight.Ptr, mapxRight, mapyRight, 
(int)INTER.CV_INTER_LINEAR, new MCvScalar(255)); 

Y esto no regresar buen resultado. Agradecería que alguien me dijera qué estoy haciendo mal.

Tengo un conjunto de 25 pares de imágenes y un tamaño de patrón de tablero de ajedrez de 9x6.

Respuesta

0

El libro "Learning OpenCV", de O'Reilly publishing, tiene dos capítulos completos dedicados a este tema específico. Ambos hacen un uso intensivo de las rutinas incluidas de OpenCV cvCalibrateCamera2() y cvStereoCalibrate(); Estas rutinas son envoltorios de código que es muy similar a lo que usted ha escrito aquí, con el beneficio adicional de haber sido depurados más a fondo por las personas que mantienen las bibliotecas de OpenCV. si bien son convenientes, ambos requieren bastante preprocesamiento para lograr las entradas necesarias en las rutinas. De hecho, puede haber un programa de ejemplo, en algún lugar en el directorio de muestras de la distribución OpenCV, que utiliza estas rutinas, con ejemplos sobre cómo pasar de la imagen del tablero de instrumentos a la matriz de calibración/intrínseca. Si profundiza en alguno de estos lugares, estoy seguro de que verá cómo puede lograr su objetivo con el asesoramiento de los expertos.

0

cv :: findFundamentalMat no puede funcionar si el parámetro intrínseco de su imagen apunta a una matriz de identidad, en otras palabras, no puede funcionar con puntos de imagen no proyectados

Cuestiones relacionadas