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

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].
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