2010-09-28 16 views
7

He estado usando la gran envoltura Emgu C# para OpenCV para recolectar imágenes desde una plataforma estéreo construida en casa. Dos webcams pegadas a un trozo de madera, a 35cm de separación, con la esperanza de permitirme producir mapas de profundidad en el rango de 10-20m. Los configuré para que sean lo más paralelos que pueda (alrededor de 89,3 grados desde una prueba de triangulación).Emgu (OpenCV para C#) - construyendo un mapa de disparidad usando cvStereoRectify

Estoy tratando de hacer un mapa de disparidad a partir de estos y, aunque el proceso funciona como código, los resultados son muy aleatorios. Con esto quiero decir que cada vez que intento ejecutar la rectificación estéreo obtengo resultados muy diferentes y la imagen a menudo está tan deformada que apenas hay nada que ver en la pantalla.

Según entiendo la manera de hacer esto es como sigue:


1) Imprima un patrón de tablero de ajedrez (por ejemplo 6 por 8 esquinas interiores) - pegar sobre una superficie plana.

2) Tome un conjunto de aproximadamente 10 fotos de la cámara 1 sosteniendo el tablero de ajedrez a la vista pero en diferentes posiciones.

3) utilizan CameraCalibration.FindChessboardCorners para encontrar las esquinas interiores (6 por 8)

4) utilizar img.FindCornerSubPix() para perfeccionar estas ubicaciones de esquina a nivel de subpixel

5) usar CameraCalibration.CalibrateCamera() para calcular los detalles intrínsecos de la cámara, y guardarlo como un archivo XML

6) Repita el procedimiento anterior para la cámara 2.

7) Ahora usted tiene la información de distorsión de la cámara interna se puede tomar un estéreo p hoto pair y use CameraCalibration.StereoCalibrate() con los datos intrínsecos calculados previamente para calcular la información extrínseca (desplazamientos y rotaciones entre la cámara 1 y 2).

8) Utilice CvInvoke.cvStereoRectify() y CvInvoke.cvInitUndistortRectifyMap() y luego CvInvoke.cvRemap() para generar una imagen de salida que debe alinearse en Y para que pueda ejecutar una de las pruebas de correspondencia estéreo.

Encontré que necesita utilizar Emgu 2.1 ver 806 para que el cvStereoRectify funcione sin un error de Violación de acceso.


Creo que mis preguntas son:

A) ¿Es correcta mi proceso? He estado haciendo la calibración intrínseca de la cámara como un proceso separado porque como las cámaras están a 35cm de distancia, no es fácil obtener el tablero de ajedrez a la vista de los dos en la oficina y moverlo mucho ... ya que pronto se va del lado de una de las vistas de la cámara. Pensé que como los valores son intrínsecos, están relacionados con la cámara y, por lo tanto, deberían transferirse al procedimiento estéreo OK. ¿Es esto correcto?

Parece que los valores intrínsecos se están alterando durante el proceso cvStereoRectify, y se están haciendo muy diferentes.

por ejemplo. valores de distorsión de la primera etapa = 0,22, -1.2,0.01, -0.01,2.6 después cvStereoRectify los valores se cambiaron a = 10, -489, -0.03, -0.09,13208

No soy un experto pero la primera conjunto parece ser más como lo que había visto de los comentarios de otras personas, y el segundo conjunto parece bastante fuera!

B) ¿Hay alguna manera de detener los valores intrínsecos + de distorsión que se actualizan durante cvStereoRectify?

C) ¿Esto parece correcto para los valores intrínsecos (937,0,290,0,932,249,0,0,1)?

Muchas gracias por cualquier consejo ... He estado atascado en esto por un tiempo ... y realmente no estoy seguro de qué parte del proceso está vomitando los errores. Cualquier sugerencia o sugerencia sería muy bienvenida ...

+0

Acabo de descubrir que todo parece funcionar mejor si recoges el conjunto de imágenes de las cámaras L y R al mismo tiempo, luego resuelves todos los puntos del modelo de objeto (es decir, coordenadas de esquina de tablero de ajedrez) y los dos conjuntos de coords de esquina de imagen (es decir, coords de subpixel de cámara izquierda y derecha). – timemirror

+0

También parece hacer un mejor trabajo cuando el tablero de ajedrez está bastante cerca de la cámara ... mi problema es que esto no me da mucho espacio para trabajar ya que mis cámaras están muy separadas. Por lo tanto, acabo de hacer un tablero de ajedrez más grande (200%) y mantenerlo más lejos ... dándome la precisión en el emparejamiento de las esquinas y también más espacio para moverlo. Parece ayudar ... ¡todavía estoy trabajando en eso! – timemirror

+0

@timemirror: ¿Ha revisado la caja de herramientas de calibración de Matlab (www.vision.caltech.edu/bouguetj/calib_doc/) o las herramientas de calibración de cámaras de Danail Stoyonov (http://ubimon.doc.ic.ac.uk/dvs/m581 .html) ambos son excelentes herramientas para la calibración. Por cierto, ¿cuáles fueron sus conclusiones con la biblioteca emguCV? ¿Obtuvo resultados satisfactorios con ella? –

Respuesta

0

No he usado EMGU en un par de años, pero lo estaba usando para calibrar una cámara y un Kinect.

Descubrí que puede haber cierta confusión con el orden de las esquinas del rectángulo si el rectángulo es completamente horizontal. Nunca llegué al fondo del por qué, y esto pareció funcionar para mí. Intenta colocar la tabla hacia arriba para que el rectángulo tenga una inclinación de 45 grados (es decir, desde la parte delantera, verás más forma de diamante, si tiene sentido).

Mi comprensión básica es que esto debería facilitar a ambas cámaras asegurarse de que escojan la misma esquina que la primera esquina para empezar a contar.

No puedo garantizar que esto solucione su problema, podría ser que tuviera algo profundamente mal en mi código y por eso no produjo resultados regulares cuando el tablero de ajedrez estaba plano. Por otra parte, no le tomará mucho tiempo para probar y podría funcionar.

Cuestiones relacionadas