En esta prĆ”ctica se abordarĆ” el tema de la reconstrucciĆ³n de puntos 3D a partir de dos cĆ”maras calibradas. Para ello, gracias al entorno de Gazebo, contamos con un robot que incorpora un par estĆ©reo calibrado del que se conoce su posiciĆ³n y separaciĆ³n. Al mundo de Grazebo se le han aƱadido una serie de objetos 3D de forma que las cĆ”maras puedan captarlos para efectuar la reconstrucciĆ³n. AsĆ mismo, tambiĆ©n tenemos a nuestra disposiĆ³n un visor de puntos 3D a travĆ©s del cual podremos ver el resultado. Al igual que en la prĆ”ctica anterior, se parte de un script donde poder aƱadir cĆ³digo y una serie de librerĆas que facilitarĆ”n muchas operaciones.
Para efectuar una reconstrucciĆ³n es necesario conocer la posiciĆ³n que ocupa el punto 3D en las dos imĆ”genes. Obviamente no se dispone de dicha informaciĆ³n, por lo que hay que escoger un punto en una de las imĆ”genes y buscar su homĆ³logo en la otra. Es importante escoger bien los puntos, ya que cuanta mĆ”s textura contengan mĆ”s fĆ”cil serĆ” encontrarlos en la otra imagen. En principio con realizar un simple filtro de bordes se podrĆan obtener puntos suficientes para efectuar una buena reconstrucciĆ³n. Sin embargo, buscar cada uno de los puntos por toda la otra imagen conlleva un coste computacional muy alto. Es necesario acotar la bĆŗsqueda de alguna forma.
Una de las principales tĆ©cnicas empleadas para la reducciĆ³n del tiempo de matching es el cĆ”lculo de la lĆnea epipolar. En reconstrucciĆ³n 3D, la lĆnea epipolar de un pixel es la recta resultante de la proyecciĆ³n en la otra imagen de todos los posibles puntos 3D que proyectan en el pixel elegido. Por tanto, el homĆ³logo de un punto en la imagen A se encuentra siempre a lo largo de esa lĆnea epipolar en la imagen B. Para calcularla es necesario conocer al menos dos puntos 3D que se encuentren en el rayo de retropoyecciĆ³n del pixel. Este rayo es el formado por la posiciĆ³n del pixel en el mundo y el punto focal de la cĆ”mara. Si proyectamos de nuevo esos dos puntos en el plano de la otra imagen podremos unirlos para obtener la lĆnea epipolar.
La librerĆa de pyProgeo nos facilita mucho estas acciones. Con dos simples funciones, 'graficToOptical' y 'backproject' se puede hacer un cambio de coordenadas necesario y retropoyectar el punto. La instrucciĆ³n 'backproject' sĆ³lo nos devuelve un punto en 3D que pertenece al rayo, pero uniendo con la posiciĆ³n de la cĆ”mara podemos formar una recta, de donde sacar todos los puntos que queramos.
A continuaciĆ³n se puede proyectar los puntos del rayo en la otra imagen, realizando el proceso inverso con las funciones 'project' y 'opticalToGrafic'. Es posible que alguno de los puntos no caigan dentro de la imagen, pero no pasa nada porque estĆ”n en el mismo plano. Con proyectar dos es suficiente para formar la epipolar. Una vez los dos puntos estĆ©n proyectados, se puede extraer de ellos la ecuaciĆ³n de la recta que los une, de la forma y = x*m + b.
Debido a que las dos cĆ”maras se encuentran a la misma altura, la pendiente de la recta deberĆa de ser cero. He podido comprobar que efectivamente obtengo un 0 casi siempre, aunque con algunos decimales, por lo que puedo decir que de momento voy por el buen camino. En la prĆ³ximas entradas del blog continuarĆ© con esta prĆ”ctica, buscando la forma de encontrar el homĆ³logo del punto inicial en la epipolar que acabo de calcular.
La librerĆa de pyProgeo nos facilita mucho estas acciones. Con dos simples funciones, 'graficToOptical' y 'backproject' se puede hacer un cambio de coordenadas necesario y retropoyectar el punto. La instrucciĆ³n 'backproject' sĆ³lo nos devuelve un punto en 3D que pertenece al rayo, pero uniendo con la posiciĆ³n de la cĆ”mara podemos formar una recta, de donde sacar todos los puntos que queramos.
A continuaciĆ³n se puede proyectar los puntos del rayo en la otra imagen, realizando el proceso inverso con las funciones 'project' y 'opticalToGrafic'. Es posible que alguno de los puntos no caigan dentro de la imagen, pero no pasa nada porque estĆ”n en el mismo plano. Con proyectar dos es suficiente para formar la epipolar. Una vez los dos puntos estĆ©n proyectados, se puede extraer de ellos la ecuaciĆ³n de la recta que los une, de la forma y = x*m + b.
Debido a que las dos cĆ”maras se encuentran a la misma altura, la pendiente de la recta deberĆa de ser cero. He podido comprobar que efectivamente obtengo un 0 casi siempre, aunque con algunos decimales, por lo que puedo decir que de momento voy por el buen camino. En la prĆ³ximas entradas del blog continuarĆ© con esta prĆ”ctica, buscando la forma de encontrar el homĆ³logo del punto inicial en la epipolar que acabo de calcular.
Comentarios
Publicar un comentario