Visão Estéreo (Bumblebee2)

De LCAD
Ir para: navegação, pesquisa

Documentação de Visão Estéreo do Robot Tropidurus.

Lauro J. Lyrio Júnior.

Instalação do Software da Bumbebee2

Foi provido com a Câmera Bumblebee2 um cd com o software para aquisição de imagens e processamento estéreo, no entanto este software se encontra desatualizado e com vários problemas de compatibilidade. Portanto foi necessário a atualização dos mesmos perante a Point Grey, eles se encontram em http://www.lcad.inf.ufes.br/svn/roboticaprobabilistica sob o diretório /Visão Estéreo/ ou podem ser baixados do site da Point Grey (www.ptgrey.com). A instalação do software é bem simplista, sendo que pode ser feita totalmente através dos assistentes de instalação. Somente se atente para o fato de que ele instala as SDK’s em C:/Arquivos de Programas/ e as referências dos exemplos estão para Program Files. Depois de feitas essas correções nos exemplos tudo deverá estar funcionando perfeitamente. Para conferir se tudo ocorreu como esperado, ligue a câmera na fonte com voltagem de 12v e encaixa a conexão FireWire no PC. Inicie o software triclopsDemo.exe que se encontra em C:\Program Files\Point Grey Research\Triclops Stereo Vision SDK\bin\


Aquisição das Imagens

Em nosso projeto é necessário a utilização de duas imagens estéreo retificadas, providas pela câmera Bumblebee2 da Point Grey (veja www.ptgrey.com). Para a obtenção de tais imagens utilizamos a própria API da câmera, que pode ser encontrada na documentação da SDK Triclops (veja Triclops Stereo Vision SDK Manual.pdf), também provido pela Point Grey. A SDK Triclops provê um ferramental amplo para soluções em Visão Estéreo, como retificação de imagens, mapa de disparidades, mapa de profundidade e projeção de nuvem de pontos. Utilizamos a SDK FlyCapture, para capturar o par de imagens da Bumblebee2, e realizamos a retificação das imagens utilizamos a SDK Triclops, o código foi implementado em C++ e posteriormente portado para C# utilizando-se da técnica de PInvoke (veja http://msdn.microsoft.com/en-us/magazine/cc164123.aspx) para utilizar as funções da câmera no código administrado. Foram implementadas 5 funções principais que foram expostas ao usuário por meio de uma DLL, para que o mesmo conseguisse utilizá-las em C# através de PInvoke. (veja http://scriptbrasil.com.br/forum/index.php?showtopic=100232 para saber como criar uma DLL).

O código de exemplo para captura e retificação das imagens pode ser encontrado em http://www.lcad.inf.ufes.br/svn/roboticaprobabilistica sob o diretório /Visão Estéreo/BumblebeeLibraryC++.

Vale ressaltar que a camera Bumblebee2 faz a captura das 2 imagens ao mesmo tempo e retorna para a API um array com as duas imagens (veja TriclopsBuildPackedTriclopsInput em Triclops Stereo Vision SDK Manual.pdf para maiores detalhes), sendo assim se faz necessário o uso de um deslocamento para que seja feita a aquisiçãoda imagem correta. O qual é feito pela parâmetro which_camera da função GetImageDLL(unsigned int which_camera) . Veja o esquema abaixo:


002.JPG

Deslocamento necessário para separar uma imagem da outra.


Visão Estéreo com OpenCV

Para computação do mapa de disparidades e de profundidade, foi utilizada a biblioteca OpenCV, para ser mais exato um wrapper dela para .NET a EmguCV. O processo, pode ser observado em http://www.lcad.inf.ufes.br/svn/roboticaprobabilistica sob o diretório /Visão Estéreo/BumblebeeLibrary (Mais informações em: http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html ).


Utilizando o Código Final

O código se encontra em http://www.lcad.inf.ufes.br/svn/roboticaprobabilistica sob o diretório /Visão Estéreo/BumblebeeLibrary.

Para fins de utilização, o código necessário está implementado em C#, onde são expostas as mesmas funções implementadas na DLL, porém com algumas modificações para adaptá-las ao código administrado:

[DllImport("BumblebeeCamDLL")] public extern static bool InitBumblebeeCameraDLL(int image_width, int image_height);

[DllImport("BumblebeeCamDLL")] public extern static bool CaptureImagePairDLL();

[DllImport("BumblebeeCamDLL")] public extern static TriclopsPackedColorImage GetImageDLL(WhichCamera cam);

[DllImport("BumblebeeCamDLL")] public extern static void CloseCameraDLL();

[DllImport("BumblebeeCamDLL")] public extern static tCameraCalibrationInfo GetCameraCalibrationInfo();

E as funções para aquisição do mapa de disparidades:

public Image<Gray, short> GetDisparityMap(Image<Bgr, Byte> image_Left, Image<Bgr, Byte> image_Right) ;

public void DisparityMap(Image<Gray, byte> image_left, Image<Gray, byte> image_right, Image<Gray, short> dispLeft, Image<Gray, short> dispRight);

Para rodar o código basta conferir as dependências do mesmo, no Visual Studio, na aba References e nas Propriedades do Projeto (Lembrando que é necessário a isntalação da EmguCV antes de mais nada: http://www.emgu.com/wiki/index.php/Main_Page). Depois pressione F5, uma tela como abaixo deve aparecer:


001.JPG


Para realizar armazenar as imagens retificadas pressione o botão ImageCapture, as mesmas serão salvas e o caminho onde elas foram salvas deverá ser exibido.