Sunteți pe pagina 1din 5

Visin estreo

Visin computacional Prctica 3 4 de diciembre de 2013

1.

I NTRODUCCIN

En los problemas de visin estreo se supondr la existencia de un par de cmaras calibradas cuyas matrices de proyeccin Pi vienen dadas por P1 P2 = = K1 I K2 I R1 0T R2 0 T 0 0 t1 , 1 t2 . 1 (1) (2)

En esta prctica se usarn las matrices de proyeccin de dos cmaras para determinar la posicin tridimensional de puntos de una escena. Esto es posible siempre que se conozcan las proyecciones de cada punto en ambas cmaras. Desafortunadamente, esta informacin no suele estar disponible y para obtenerla es preciso emplear el contenido de las imgenes (sus pxeles) en un proceso de bsqueda conocido como puesta en correspondencia. Conocer las matrices de proyeccin de las cmaras permite acotar el rea de bsqueda gracias a las restricciones que proporciona la geometra epipolar.

Una serie de pares estreo en el directorio images; el sujo del chero indica si corresponde a la cmara izquierda (_left) o a la derecha (_right). Bajo el directorio rectif se encuentran una varios pares estreo recticados, y en stereogram hay algunos estereogramas. Un conjunto de funciones auxiliares de Python en el mdulo misc.py. La descripcin de las funciones puede consultarse con el comando help o leyendo su cdigo fuente. El archivo cameras.npz con las matrices de proyeccin del par de cmaras con el que se tomaron todas las imgenes con prejo minoru.

4.

C ONDICIONES
La prctica es individual. La fecha de entrega lmite es el 7 de enero 2014 a las 23:59. La entrega consiste en: Documento PDF con los resultados de los ejercicios que lleven el smbolo y las guras de los ejercicios que lleven el smbolo . El chero stereo.py, que debe contener el cdigo fuente de los ejercicios marcados con . Este smbolo puede indicar tanto la implementacin de una funcin completa como simplemente la insercin de unas pocas lneas de cdigo. Todos los ejercicios tericos deben estar justicados. La funcin main debe llevar a cabo una ejecucin de la prctica que incluya, al menos, la carga de un par de imgenes, el clculo de la matriz fundamental, la recticacin de las imgenes, la puesta en correspondencia y la representacin de la reconstruccin. Se valorar que se muestre informacin relevante en consola mediante la funcin print. Los archivos pueden enviarse comprimidos en zip o tar.gz a la direccin de correo lbaumela@fi.upm.es. En caso de duda sobre la recepcin del correo, pedid conrmacin.

2.

O BJETIVOS

Los objetivos de la prctica son: reconstruir puntos de una escena a partir de una serie de correspondencias manuales entre dos imgenes calibradas; determinar la geometra epipolar de un par de cmaras a partir de sus matrices de proyeccin; implementar la bsqueda automtica de correspondencias que use las restricciones impuestas por la geometra epipolar, aplicando para ello mtodos de cortes de grafos; realizar una reconstruccin densa de la escena.

3.

M ATERIAL

El material necesario para la prctica se puede descargar de www.dia..upm.es/~lbaumela/Vision13/ Practicas/stereo.zip. Tambin ser necesario la librera de minimizacin mediante cortes de grafos empleada en el tema anterior. El archivo contiene:

5.

R ECONSTRUCCIN

Teniendo un conjunto de correspondencias de puntos entre dos imgenes calibradas (con matrices de calibra-

V ISIN

COMPUTACIONAL

2013

cin Pi conocidas) es posible llevar a cabo una reconstruccin tridimensional de dichos puntos. Como es lgico, para esta seccin se necesitan dos imgenes con parmetros de calibracin conocidos. Las imgenes para esta prctica se han obtenido con el mismo par de cmaras que las de la primera prctica. Los intrnsecos, por tanto, son iguales en ambas prcticas. Sin embargo, los extrnsecos son diferentes a los de la primera prctica, por lo que las matrices de proyeccin cambian. En el chero cameras.npz se encuentran las matrices de proyeccin para las dos cmaras. Para cargar este chero: cameras = np.load("cameras.npz") P1 = cameras["left"] P2 = cameras["right"] Todas las imgenes con el prejo minoru comparten este par de matrices de proyeccin. Ejercicio 1. Implementa la funcin M = reconstruct(points1, points2, P1, P2) que, dados una serie de N puntos 2D points1 de la primera imagen (en coordenadas homogneas) y sus correspondientes N puntos 2D points2 de la segunda imagen (tambin en coordenadas homogneas), y el par de matrices de proyeccin P1 y P2 de la primera y la segunda cmara respectivamente, calcule la reconstruccin tridimensional de cada uno de los puntos. De ese modo, si points1 y points2 son 3 N , la matriz resultante M debe ser 4 N . El tipo de reconstruccin debe ser algebraico, no geomtrico. Medio, 3 puntos

Aade una imagen de las reproyecciones a la documentacin de la prctica. Fcil, 1 punto

6.

G EOMETRA EPIPOLAR

La geometra epipolar es la geometra derivada de las relaciones geomtricas que aparecen debido a las proyecciones de una escena sobre un par de cmaras. La matriz fundamental F, que depende exclusivamente de la conguracin de las cmaras y no de la escena que stas observan, contiene toda la informacin relacionada con dicha geometra: a partir de ella se pueden calcular los epipolos y las lneas epipolares. La relacin entre un par de cmaras P1 y P2 y la matriz fundamental es de n-a-1 (salvo factor de escala). Es decir, dadas dos cmaras calibradas, slo tienen una matriz fundamental (excepto un factor de escala); dada una matriz fundamental existen innitas conguraciones de cmaras posibles asociadas a ella. Ejercicio 4. Implementa la funcin F = projmat2f(P1, P2) que, dadas dos matrices de proyeccin, calcule la matriz fundamental asociada a las mismas. F debe ser tal que, si m1 de la imagen 1 y m2 de la imagen 2 estn en correspondencia, entonces mT 2 Fm1 = 0. (3)

Incluye en la funcin main el cdigo para calcula la matriz fundamental del par de cmaras de la prctica, y copia dicha matriz a la documentacin de la prctica.

Ejercicio 2. Carga dos imgenes con el prejo minoru. Usa la funcin points1, points2 = askpoints(img1, img2) que viene en el material distribuido con la prctica para indicar en las imgenes una serie de pares de puntos. Marca al menos 15, de modo que la escena sea ms o menos reconocible en la reconstruccin. Reconstruye los puntos marcados con la funcin reconstruct. Visualiza la reconstruccin con el comando misc.plot3D. Aade una captura de la reconstruccin a la documentacin de la prctica. Fcil, 1 punto Ejercicio 3. Reproyecta los resultados de la reconstruccin en las dos cmaras y dibuja las proyecciones sobre las imgenes originales. Comprueba que las proyecciones coinciden con los puntos seleccionados en el ejercicio anterior. Para dibujar los puntos puedes usar la funcin plothom de la prctica anterior o la versin que se distribuye con esta prctica (misc.plothom).

b Medio, 1 punto

Ejercicio 5. Implementa la funcin P1, P2 = f2projmat(F) que, dada una matriz fundamental, calcule un par de matrices de proyeccin que la generan. Comprueba con projmat2f que estas matrices de proyeccin efectivamente tienen a F como matriz fundamental. Es muy importante que las matrices devueltas por la funcin f2projmat sean efectivamente matrices de proyeccin. La solucin a este ejercicio est en la pgina 256 de [2]. Difcil, 1 punto

Ejercicio 6. Cmo es la matriz fundamental de dos cmaras que comparten el mismo centro? (Por ejemplo, dos cmaras que se diferencian slo por una rotacin.)

b Medio, 1 puntos

Dada la matriz fundamental F entre las cmaras 1 y 2, se puede determinar, para un determinado punto m1 en la imagen de la cmara 1, cul es la recta epipolar l2 donde se encontrar su homlogo en la cmara 2: l2 = Fm1 . (4)

P RCTICA 3. V ISIN

ESTREO

Las siguientes dos funciones sirven para comprobar esta propiedad. En primer lugar, se necesita una funcin que dibuje rectas expresadas en coordenadas homogneas, es decir, la versin de plothom para rectas en lugar de puntos. Ejercicio 7. Implementa la funcin plothline(line) que, dada una lnea expresada en coordenadas homogneas, la dibuje. En el material entregado para esta prctica hay una implementacin base que puedes completar. Medio, 2 puntos

20 40 60 80 100 120 140 160 180 20 40 60 80 100 120 140 160

20 40 60 80 100 120 140 160 180 20 40 60 80 100 120 140 160

Figura 1. Par de imgenes recticadas. de bsqueda unidimensional sobre las de pxeles de las imgenes. En el material de la prctica se han incluido dos funciones que rectican (mediante un mtodo lineal) dos imgenes. La funcin H1, H2 = misc.projmat2rectify(P1, P2, imsize) devuelve, dadas las dos matrices de proyeccin y el tamao de las imgenes en formato (filas,columnas), las homografas que rectican, respectivamente, la imagen 1 y la imagen 2. La funcin projmat2rectify hace uso de projmat2f, implementada en el ejercicio 4, por lo que es necesario que esta funcin est disponible. La funcin O1, O2 = misc.rectify_images(im1, im2, H1, H2) realiza la recticacin. Usa las dos imgenes originales y las dos homografas proporcionadas por projmat2rectify y devuelve las dos imgenes recticadas. La Figura 1 muestra un par de imgenes recticadas con este mtodo. Ejercicio 9. Se tienen dos imgenes no recticadas im1 e im2, y su matriz fundamental asociada F. Con el procedimiento explicado, se encuentran un par de homografas H1 y H2 que dan lugar a las imgenes recticadas O1 y O2. Cul es la matriz fundamental F asociada a estas dos imgenes? Por qu? Nota: F depende exclusivamente de F, H1 y H2.

Ejercicio 8. Completa la funcin plot_epipolar_lines(image1, image2, F) que, dadas dos imgenes y la matriz fundamental que las relaciona, pide al usuario puntos en la imagen 1 y dibuje sus correspondientes epipolares en la imagen 2 usando plothline. En el material entregado para esta prctica hay una implementacin base que puedes completar. Utiliza esta funcin con un par de imgenes llamndola de dos formas diferentes: seleccionando puntos en la imagen izquierda y dibujando las epipolares en la imagen derecha y viceversa. Comprueba en ambos casos que las epipolares siempre pasan por el punto de la segunda imagen correspondiente al seleccionado en la primera. Aade dos guras de este ejercicio a la documentacin de la prctica; una que muestre la seleccin de puntos en la imagen izquierda y las rectas correspondientes en la imagen derecha, y otra que lo haga al revs. Indica para ambos casos qu matriz fundamental has usado al llamar a plot_epipolar_lines. Fcil, 1 punto

7.

B SQUEDA DE CORRESPONDENCIAS

La bsqueda de correspondencias consigue establecer automticamente las correspondencias de puntos entre dos imgenes (lo que se ha hecho manualmente en el ejercicio 2) haciendo uso de las restricciones que proporciona la geometra epipolar. Es recomendable trabajar a partir de ahora con imgenes en blanco y negro y con valores reales entre 0 y 1 para cada uno de sus pxeles. Eso se puede conseguir con img1 = misc.rgb2gray(img1/255.0) La mayora de algoritmos de puesta en correspondencia, incluyendo el que se va a implementar en esta prctica, requieren que las imgenes de entrada estn recticadas. Dos imgenes estn recticadas si sus correspondientes epipolares estn alineadas horizontalmente. La recticacin de imgenes facilita enormemente los algoritmos de puesta en correspondencia, que pasan de ser problemas de bsqueda bidimensional a problemas

b Medio, 1 punto

Ejercicio 10. Rectica un par de imgenes estreo, calcula la matriz fundamental asociada a estas imgenes y usa plot_epipolar_lines para dibujar varias lneas epipolares de las imgenes recticadas. Aade una gura a la documentacin de la prctica con el resultado de este ejercicio, y el cdigo necesario para generarla en la funcin main. Fcil, 1 punto

Una vez recticadas las dos imgenes de un par estreo, se pueden buscar las correspondencias. Una matriz de disparidades S indica, para cada pxel de la imagen 1 recticada, a cuntos pxeles de diferencia est

V ISIN

COMPUTACIONAL

2013

su correspondencia en la imagen 2 recticada. En nuestra prctica, para simplicar el problema, vamos a considerar que los elementos de S son enteros. Para el pxel en la posicin (x, y ) en la imagen 1, su correspondiente est en (x + S[y, x], y ) en la imagen 2. Si S[y, x] < 0, la correspondencia est hacia la izquierda; si S[y, x] > 0, la correspondencia est hacia la derecha; si S[y, x] = 0, las coordenadas de los dos puntos coinciden en ambas imgenes. La bsqueda de correspondencias requiere ser capaz de determinar el parecido visual entre pxeles de dos imgenes. Si los pxeles m1 y m2 son visualmente parecidos, tienen ms probabilidades de estar en correspondencia que otro par m 1 y m2 que sean visualmente diferentes. Como la apariencia (el nivel de gris) de un nico pxel es propensa al ruido y poco discriminativa, lo habitual a la hora de determinar el parecido visual entre dos pxeles es considerar no slo a stos sino tambin a sus vecinos. Dado un pxel m de una imagen, llamaremos vecindad del pxel de radio K al conjunto de pxeles de la imagen que se encuentren dentro de una ventana de tamao (2K + 1) (2K + 1) pxeles centrada en m. El nmero de pxeles de una vecindad de radio K es N = (2K +1)2 . Dadas dos vecindades w1 y w2 de dos pxeles, el parecido visual entre ellas puede calcularse con la suma de diferencias al cuadrado (SSD) de cada una de sus componentes
N

para la imagen 1 y la imagen 2 desplazada 3, 2, 1, 0 y 1 pxeles en sentido horizontal. K es el parmetro que indica el radio de las ventanas usado por localssd. El valor devuelto D ser un array de tamao LM N , donde L es el nmero de disparidades indicadas por disps, L =len(disps) (es decir, el nmero de veces que se ha llamado a localssd); M y N son, respectivamente, el nmero de las y de columnas de las imgenes de entrada. El elemento D[l,y,x] debe ser la SSD entre la ventana centrada en im1[y,x] y la ventana centrada en im2[y,x + disps[l]]. D[l,y,x] debe ser muy grande para aquellos valores en los que im2[y,x + disps[l]] no est denido, es decir, el ndice (y,x+disps[l]) se sale de la imagen 2. Aplica la funcin ssd_volume a un par de imgenes recticadas. Aade el cdigo necesario en la funcin main. Almacena el array de disparidades disps en una variable en la funcin main. Ser necesario en ejercicios posteriores. Medio, 2 punto

La matriz D calculada en el ejercicio anterior proporciona los costes unitarios Di de una funcin de energa sin regularizacin de la forma E (x ) =
i

Di (x i ),

(6)

dSSD (v, w) =
i=1

( v i wi ) 2 .

(5)

La distancia dSSD es siempre positiva, es pequea cuando dos ventanas son visualmente parecidas y grande en caso contrario. Ejercicio 11. Implementa la funcin C = localssd(im1, im2, K) que calcule la suma de diferencias al cuadrado entre las ventanas de radio K de la imagen 1 y la imagen 2. El resultado debe ser una matriz del mismo tamao que las imgenes de entrada que contenga en cada punto el valor de dSSD para la ventana de la imagen 1 y la ventana de la imagen 2 centradas en l. Es decir, C[i,j] debe ser el resultado de dSSD para las ventanas centradas en im1[i,j] e im2[i,j]. Para este ejercicio puede resultar til la funcin scipy.ndimage.convolve. Fcil, 1 punto

donde Di (l) viene dado por D[l,y,x], suponiendo que el pxel i tenga coordenadas (x, y ). Las variables x = (x1 , . . . , xN M ) indican las etiquetas de cada uno de los pxeles. En este caso, las etiquetas son los ndices del array disps, que a su vez son las disparidades horizontales. Por eso, a partir de aqu se hablar indistintamente de etiquetas y disparidades. Slo es necesario recordar que la etiqueta l est asociada a la disparidad disps[l]. Minimizando la energa (6), x = arg min E (x),
x

(7)

se obtiene un vector de etiquetas ptimo x que indica, para cada pxel, cul es su disparidad horizontal entre las dos imgenes. Ejercicio 13. Incluye en la funcin main el cdigo necesario para minimizar la energa de la ecuacin (6). Dibuja el resultado de la minimizacin e inclyelo en la documentacin de la prctica. Fcil, 0.5 puntos

Ejercicio 12. Implementa la funcin D = ssd_volume(im1, im2, disps, K) que calcule la suma de diferencias al cuadrado entre las ventanas de la imagen im1 y la imagen im2 desplazada horizontalmente. El parmetro disps debe ser una lista de valores indicando las disparidades que se usarn para desplazar la imagen im2. Por ejemplo, si disps es np.arange(-3,2), se llamar 5 veces a localssd

El etiquetado usando exclusivamente trminos unitarios es muy sensible al ruido y propenso a que aparezcan zonas de pxeles cercanos con mucha variacin en las etiquetas. Esto es especialmente notable en zonas planas (es decir, sin textura) de las imgenes originales, donde no hay suciente informacin para establecer una correspondencia basndose exclusivamente en la apariencia visual de ventanas pequeas. Por eso es necesario incluir un trmino de suavizado o regularizacin en la funcin de energa. Los tipos de saltos de etiquetas que

P RCTICA 3. V ISIN

ESTREO

aparecern en el resultado nal dependern de cmo sea ese trmino de suavizado. La funcin de energa que utilizaremos para calcular las disparidades en la prctica ser el resultado de aadir a la expresin (6) un trmino que penalice los cambios de disparidad en los pxeles vecinos: E (x ) =
i

Di (x i ) +
ij

|x i x j |.

(8)

La solucin al problema de la correspondencia vendr dado por el conjunto de etiquetas (disparidades) de los pxeles de la imagen que minimicen la expresin (8). En [1] se presentan mtodos para resolver algunos problemas de optimizacin con varias etiquetas empleando algoritmos de cortes de grafos. Es recomendable repasar la seccin 5. Este artculo est en los materiales del tema anterior. Para el Ejercicio 14 se debe utilizar la librera PyMaxflow, ya utilizada en la prctica anterior. Ejercicio 14. Escribe la funcin find_corresp_aexpansion(D, initLabels, lmb, maxV), que reciba un volumen ssd, D, un conjunto inicial de etiquetas, initLabels, que puede ser el obtenido en el ejercicio 13, el valor de la constante y el valor mximo de la funcin de coste |xi xj |, que tendrs que establecer empricamente. El resultado de esta funcin sern las etiquetas que minimizan (8). Para ello debes utilizar la funcin maxflow.fastmin.aexpansion_grid del paquete maxflow, que resuelve el problema anterior mediante un algoritmo de cortes de grafos empleando una -expansin. Llama a esta funcin desde main. Aade tambin a la documentacin de la prctica una gura con las etiquetas que resulten de la minimizacin de la energa para un par de imgenes que elijas. Es importante que todo el cdigo desarrollado para este ejercicio est bien organizado y documentado. Medio, 2 puntos

que, dado un par de imgenes sin recticar, la matriz de disparidades entre las imgenes recticadas y las homografas que llevan de las imgenes sin recticar a las imgenes recticadas, pida al usuario puntos en la primera imagen y dibuje sus correspondencias en la segunda. En el material entregado para esta prctica hay una implementacin base que puedes completar. Incluye en la documentacin de la prctica una gura con el resultado de este ejercicio. Medio, 0.5 puntos

Con el material de la prctica se distribuye la funcin misc.dense_reconstruction que realiza una reconstruccin densa a partir de la matriz de disparidades. Esta funcin hace uso de reconstruct, as que deber estar implementada para que funcione. Consulta la ayuda o el cdigo de dense_reconstruction para comprender cmo se usa. Ejercicio 16. Realiza una reconstruccin densa usando la funcin misc.dense_reconstruction aadiendo el cdigo necesario en la funcin main y una gura en la documentacin mostrando el resultado. Normalmente, en la matriz de disparidades S suele haber reas donde las correspondencias estn mal calculadas, bien por falta de textura en las imgenes iniciales, o bien porque el campo de visin de ambas cmaras no coincide y hay partes de la escena capturadas por la cmara izquierda que no son visibles desde la cmara derecha. Es conveniente omitir estas reas de la matriz de disparidades a la hora de realizar la reconstruccin. Para ello, la funcin misc.dense_reconstruction ofrece el parmetro region, que permite especicar el rea rectangular de la matriz de disparidades que ser empleada en la reconstruccin. Consulta la documentacin de misc.dense_reconstruction. Fcil, 1 punto

R EFERENCIAS
[1] Yuri Boykov, Olga Veksler, and Ramin Zabih. Fast approximate energy minimization via graph cuts. IEEE Transactions on Pattern Analysis and Machine Intelligence, 23:12221239, 2001. [2] R. I. Hartley and A. Zisserman. Multiple View Geometry in Computer Vision. Cambridge University Press, ISBN: 0521540518, second edition, 2004.

La matriz de etiquetas ptimas X obtenida de la minimizacin de la funcin de energa puede transformarse en la matriz de disparidades S indexando en cada una de sus celdas el array de disparidades disps: S = disps[X] Ahora, el pxel de coordenadas (x, y ) de la primera imagen recticada tendr su correspondencia en el pxel de coordenadas (x + S[y, x], y ) de la segunda imagen recticada. El siguiente ejercicio usa la matriz de disparidades para establecer automticamente las correspondencias entre un par de imgenes sin recticar. Ejercicio 15. Implementa la funcin plot_correspondences(image1, image2, S, H1, H2)

S-ar putea să vă placă și