Trabalho 2 - Calibracao a partir de um padrao

 

Descrição do trabalho:

Este trabalho foi dividido em duas partes:

1-     Reconhecer os cantos de um tabuleiro de xadrez e desenhar um feedback sobre eles.

2-     Calcular para cada quadro os parâmetros da câmera (posição e distância focal) e desenhar num canvas OpenGL a imagem do tabuleiro e três linhas simbolizando os eixos xyz que esta preso num dos cantos do tabuleiro.  Use a cor vermelha  para x, a cor verde para y e a cor azul para z.

Ambiente de desenvolvimento:

            O trabalho foi desenvolvido no Microsoft Visual Studio 2005 utilizando as bibliotecas:

1 - OpenCV para dar suporte a leitura de arquivos .avi, interface gráfica e chamadas de funções específicas.

2 -  OpenGl para renderizar os eixos

3 – Qt para interface gráfica

4- Cal3D para renderizar avatar

5 – Osgrenderer para renderizar a plataforma de petroleo

O que foi feito:

            A primeira parte do trabalho foi feita utilizando as chamadas de função do OpenCV cvFindChessboardCorners [1] para achar os cantos de um tabuleiro de xadrez 6 X 8 e a função cvDrawChessboardCorners [1] para dar o feedback dos pontos encontrados. Dado que os vídeos fornecidos no curso para realizar o trabalho tinham problemas de qualidade, viu-se a necessidade de implementar alguns algoritmos que ajudassem o reconhecimento dos cantos e posteriormente obter calibrações melhores na etapa 2.

A primeira melhoria implementada foi a chamada de mais uma função do próprio OpenCV cvFindCornerSubPix [1], que refina os pontos encontrados pela chamada cvFindChessboardCorners.

Outra melhoria implementada foi aplicação de filtros para redução de noise que em determinados casos atrapalham a detecção dos cantos. Porém em alguns casos a aplicação do filtro atrapalhou o reconhecimento, como pode ser visto na tabela abaixo:

 

Estes vídeos foram disponibilizados no curso em [2].

Em alguns casos a função do OpenCV retorna pontos inválidos que podem ser tratados facilmente da seguinte forma:

p     Eliminação de Pontos inválidos

n      Guardar posições do frame anterior

n      Determinar os valores máximos e mínimos de x e y

n      Caso algum ponto do frame atual exceda esses limites acrescido de uma constante, ele é considerado um falso positivo

n      Caso o ponto seja um falso positivo

p     Buscar informação no frame anterior

n      Caso contrário

p     Ponto é válido

rotacaoTabuleiro_0.bmp

 

rotacaoTabuleiro_0.bmprotacaoTabuleiro_res0.bmp

 
O resultado desta melhoria pode ser visto abaixo:

 

 

 

 

 

 

         Pontos vermelhos – falsos positivos vindos do OpenCV

         Pontos vermelhos e verdes – frame corrente validados

         Pontos amarelos – frame anterior perdidos pelo OpenCV

 

Mesmo com estas melhorias, em alguns frames as funções do OpenCV não conseguem achar todos os pontos do tabuleiro de xadrez. Com isso, foi implementado um algoritmo de coerência temporal entre os frames. Os resultados obtidos com esta implementação pode ser visto nas figuras abaixo.

A imagem da esquerda ilustra o frame capturado de um dos vídeos disponibilizados e a imagem da esquerda o mesmo frame processado com as funções do OpenCV. Os pontos verdes são os encontrados pelas funções do OpenCV e os verdes são os pontos obtidos a partir do algoritmo de coerência temporal. A determinação de quais os pontos serão aproveitados do frame passado é feita da seguinte forma. Primeiramente encontra-se os pontos do frame atual (obtidos a partir do OpenCV) no frame anterior. Para encontrá-los é necessário utilizar um pequeno offset, pois os pontos do frame anterior não estão exatamente na mesma posição do frame corrente. Os pontos que sobraram da identificação dos pontos do frame corrente no frame anterior serão adicionados na tela. Os pontos identificados são guardados e servirão para futuras análises. Segue abaixo outra figura que mostra outra vantagem da coerência tempo quando temos alguma coisa impedindo o OpenCV de detectar os pontos.

 

A última melhoria utilizada foi a utilização do filtro de Kalman [3] para prever a posição dos pontos no próximo frame. Esta implementação foi retirada do pipeline por ser muito lenta e não obteve ganhos satisfatórios.

 

A partir do momento em que temos os pontos da primeira parte do trabalho podemos calcular os parâmetros intrínsecos e extrínsecos da câmera. Isso foi feito utilizando o método Tsai2D [4] (a idéia inicial era implementar a calibração com o método Zhang [5], porém ele se mostrou muito instável). Como saída do método Tsai obtemos matrizes de rotação e translação da câmera para montarmos a matriz do OpenGL ModelView e a distancia focal e os planos de projeção para montar a matriz Projection. Com essas matrizes foi possível desenhar os eixos e outros objetos como pode ser visto nas figuras abaixo.

 

Outro requisito deste trabalho foi tratar a inversão do padrão capturado. Em um dos vídeos fornecidos no curso ocorre a total inversão do padrão (rotação de 360 graus no eixo z). Se este caso não for tratado o eixo que estava sendo desenhado em um canto da tela, irá aparecer no canto inverso. Para solucionar este problema foram criadas duas soluções:

1-

         Achar a equação da reta dos pontos com menor coordenada y

         Caso a quantidade de pontos que passe pela reta mude de um frame para o outro, ocorreu inversão.

2-

         Avaliação da distância entre o primeiro ponto capturado entre os frames

         Caso a distância entre o ponto nos frames for maior que uma constante e os últimos n frames estavam calibrados, ocorreu inversão.

Outros softwares podem ser consultados com o Artag [6], que utiliza outro sistema de marcadores mais eficientes do que os utilizado neste trabalho. Uma outra referencia para comparação de desenpenho entre as bibliotecas de calibração de câmera pode ser encontrado em [7].

 

Download do trabalho

 

Bibliografia:

[1]- Manual do Opencv, visitado em 10/08/2007 http://www.cs.unc.edu/Research/stc/FAQs/OpenCV/OpenCVReferenceManual.pdf

[2] – Vídeo de teste para o curso, visitado em 07/09/2007 http://www.tecgraf.puc-rio.br/~mgattass/ra/videos

[3] - Kalman, R. E. "A New Approach to Linear Filtering and Prediction Problems," Transactions of the ASME - Journal of Basic Engineering Vol. 82: pp. 35-45 (1960).

[4] - Tsai, R. Y. (1987), ‘A versatile camera calibration technique for high-accuracy 3d machine vision metrology using off-the-shelf tv cameras and lenses’, Ieee Journal Of Robotics And Automation RA-3(4), 323–344.

[5] - Zhang, Z. (1998), A flexible new technique for camera calibration, Technical report, Microsoft Corporation.

[6] – Biblioteca de calibração de câmera, visitado em 18/09/2007 http://www.artag.net/

[7] - Fiala, M., Shu, C. (November 2005), Fully Automatic Camera Calibration Using Self-Identifying Calibration Targets, NRC-CNRC