Pontifícia Universidade
Católica do Rio de Janeiro
Departamento de Informática
Trabalho de Realidade
Aumentada e Cooperativa
2003.2
Rodrigo Espinha
|
|
|
DOWNLOAD – Binários para
Win32 / Código Fonte
1. Introdução
Esse trabalho utiliza os conhecimentos adquiridos nas aulas para inserir corretamente objetos virtuais tri-dimensionais em imagens de uma cena real, capturadas por uma câmera de vídeo digital do tipo WebCam.
A meta a ser alcançada era que fosse possível posicionar corretamente um objeto 3D, desenhado com OpenGL, sobre um determinado padrão que seria detectado na imagem, em tempo-real. Para isso, foram necessários, basicamente, os seguintes passos, que serão detalhados nas próximas seções ao longo deste texto:
1. Capturar de imagens a partir de uma câmera digital e conhecer os parâmetros que afetam o equipamento utilizado.
2. Processar as imagens capturadas, reduzindo ruídos e realçando as características desejadas.
3. Detectar o padrão e seus pontos de interesse, baseando-se em um modelo pré-definido.
4. Calibrar uma câmera virtual 3D que correlacione pontos do mundo real e sus projeção na imagem, para permitir a inserção correta de objetos virtuais.
5. Renderizar os objetos virtuais.
O objetivo deste
documento é apresentar as experiências vividas durantedesenvolvimento do
trabalho.
2. Captura das imagens
Para capturar as imagens foi utilizada uma WebCam da Creative Labs. O interessante deste tipo de equipamento é o baixo custo e a facilidade de ser encontrada no mercado. Além disso, a qualidade das imagens capturadas com essa câmera se mostrou satisfatória para os seus propósitos. A própria câmera corrige automaticamente alguns dos itens que foram classificados no início como potenciais problemas, como o flicker causado por lâmpadas fluorescentes, e gera níveis de ruídos aceitáveis.
A distorção radial das imagens, devida ao formato das lentes da câmera, não representou um problema para os algoritmos utilizados. Entretanto, se for utilizada a transformada de Hough, talvez essa distorção afete o resultado, pois introduz novas direções para as retas das componentes conexas da imagem binarizada. Essa distorção é tratada por métodos de calibração de câmera.
Assim, foi possível tratar as imagens obtidas, como imagens “quase ideais” para o escopo do trabalho. Houve problemas para a extração de parâmetros estatísticos como o desvio padrão de um conjunto de imagens capturadas com esse tipo de câmera, mas isso não afetou as etapas subseqüentes (a menos, talvez, se fosse necessário calcular o devio padrão...)

Desvio padrão
3. Processamento das imagens capturadas
A segunda etapa consiste em tratar as imagens para que seja possível extrair as características desejadas, como as bordas do padrão.
Primeiramente, é utilizado um filtro Gaussiano de kernel 3x3 para reduzir ruídos na imagem (analisando as imagens pôde-se perceber que o ruído poderia ser modelado como ruído gaussiano). O filtro da mediana foi testado, mas esse apresentou melhores resultados para ruídos do tipo sal-e-pimenta.
Após a filtragem inicial da imagem foram os seguintes detectores de aresta: Sobel Edge Detector e Canny Edge Detector. A partir desses detectores, pode-se obter imagens binárias com as regiões onde ocorrem bordas (altas freqüências) em evidência.

|
|
|
|
Sobel Edge Detector |
Canny Edge Detector |
O Sobel Edge Detector é muito eficiente, pois é necessário apenas passar um filtro de convolução na imagem, mas gera linhas bastante grossas. Esse algoritmo se mostrou mais robusto que o de Canny para detectar componentes conexas fechadas, o que é importante para a detecção do padrão utilizado.
Por outro lado o Canny Edge Detector apresenta custo maior, mas retorna linhas mais finas (geralmente com 1 pixel de espessura ), e algoritmo já extrai componentes conexas da imagem automaticamente. O problema, é que às vezes segmenta demais os componentes: uma linha na imagem binária, pode ser composta de vários componentes extraídos com o Canny Edge Detector. Além disso, se não houver tratamento adicional, podem ser extraídas duas componentes adjacentes na imagem binária, fazendo com que uma linha possa ter 2 pixels de espessura em alguns trechos, o que não é desejável em alguns casos. A vantagem desse algoritmo parece ser a geração de componentes conexas menores, consistindo de menos informação a ser tratada.
4. Detecção do padrão

O padrão acima foi escolhido devido às seguintes características:
· Possui o mínimo de 8 pontos (os 8 cantos), necessários para o algoritmo de calibração de câmera.
· É formado de componentes conexas fechadas (isso ajudou a separá-lo do resto da imagem).
· Apresenta assimetrias que permitem determinar a sua orientação.
· Facilidade de relacionar retângulo interior com o exterior, e esses com o modelo.
Tendo definido um padrão, era necessário encontrar uma forma de detectá-lo na imagem binária. A primeira técnica utilizada foi a transformada de Hough. O objetivo era encontrar as retas das bordas e achar os pontos de interesse (cantos) através das interseções dessas retas. Essa transformada é baseada em “votação” e depende de um threshold para determinar os candidatos a pontos de máximos locais, que serão classificados como retas. Além disso os cálculos são feitos em um domínio discreto, o que gera uma certa imprecisão.
A transformada de Hough, entretanto, se mostrou pouco robusta e instável para a detecção do padrão. No caso de linhas compostas de muitos pixels e/ou curvadas pela distorção radial da câmera (nesse caso a distorção radial influenciou o resultado), podem ser detectadas várias retas em diferentes orientações. As linhas menores, com pouca influência na votação,
são freqüentemente eliminadas pelo valor de threshold necessário para evitar o excesso de retas causado pelas linhas grandes e/ou curvadas. Isso gere um tradeoff entre um valor baixo, que permite passar muitas retas e aumenta o custo para detecção e um valor alto, que pode não deixar passar retas que são necessárias para a detecção do padrão. Por sua instabilidade a transformada de Hough foi descartada e outras formas de detecção foram pesquisadas.
|
|
|
Assim, uma abordagem baseada nos seguintes passos, foi utilizada:
Os cantos de uma
componente conexa pode ser detectado percorrendo a componente de espessura 1 e
procurando por mudanças na direção da reta tangente, como mostrado na figura
abaixo. Os pontos vermelhos representam as posições atuais de uma janela de
tamanho fixo. Se o ângulo entre os vetores tangentes à componente nessas
posições for maior que um certo threshold, todos os pontos (azul claro) entre
essas posições são marcados como candidatos a cantos (isso é necessário, pois
as regiões dos cantos podem ser arredondadas, possuindo vários candidatos).
Para calcular os vetores tangentes é definido um valor DV suficientemente
grande para evitar ruídos na componente (por exemplo, se calcular a tangente
como p[i+1] – p[i], as ondulações podem facilmente geras resultados errados).
Os vetores são então calculados: v1 = p[i0]–p[i0-DV] e v1
= p[i1+DV]-p[i1]. Finalmente, cada região candidata é percorrida, procurando
o ponto de maior distância euclidiana à reta definida pelo vetor V = p[i1] – p[i0]. Esse ponto é o canto
dessa região.

Com isso, temos os cantos de todas as componentes conexas ordenados angularmente (CCW ou CW). A detecção do padrão é feita, primeiramente, eliminando as componentes que não têm 4 cantos. Após isso, as componentes são comparadas entre si, procurando o menor quadrilátero contido dentro de outro. Isso praticamente elimina as chances de encontras as componentes erradas, a menos, é claro, que na imagem exista outro quadrilátero menor que o padrão dentro de outro. Tendo detectado o padrão, podemos determinar sua orientação, valendo-nos na assimetria: após outras tentativas foi usada a diferença entre os centros (interseção das diagonais) dos quadriláteros externo e interno, como o vetor direção, já a relação de direção entre centros é invariante quanto à projeção de perspectiva. Finalmente, baseando-se na direção do padrão, podemos relacionar os pontos do modelo com o padrão.
5. Calibração da câmera e renderização de objetos
virtuais
O algoritmo utilizado para a calibração da câmera foi o Tsai 2D. Este algoritmo apresentou ótimos resultados. Porém os pontos calibrados “tremiam” muito. Isso pode ser facilmente notado em uma cena estática (câmera e padrão parados, com mesma iluminação), onde as mínimas interferências do ambiente faziam com que os cantos do padrão variassem muito pouco, mas os parâmetros calibrados para esses pontos (a calibração de todos os parâmetros era feita novamente a cada frame, pois não era mutio cara) assumiam valores bem diferentes dos anteriores, causando tremedeira nos pontos calibrados projetados na imagem original.
Dessa forma, alguns melhoramentos foram testados, com a assistência dos professores da disciplina: calibrar a cada frame apenas os parâmetros extrínsecos (os intrínsecos apenas uma vez), usar mais pontos para calibração (extraindo pontos intermediários entre os oito originais) e aplicar o filtro de Kalman para suavizar. Os primeiros reduziram significativamente a “tremedeira”. A combinação desses melhoramentos com o filtro de Kalman (que foi o que mais reduziu a “tremedeira”, ajustando os seus parâmetros para confiar pouco nos valores medidos da câmera calibrada), produziu ótimos resultados.
Finalmente, com as matrizes da câmera calibrada a renderização de objetos virtuais foi direta.
6. Conclusões
A aplicação dos algoritmos estudados permitiu descobrir que esses podem não ser tão robustos como poderia parecer estudando-os apenas teoricamente, ou que um que, na teoria seria ideal para um determinado problema, na prática não é aplicável para esse domínio, por razões de eficiência ou estabilidade, por exemplo. A instabilidade é um fator intrínseco de alguns algoritmos, e às vezes, é preciso bastante trabalho para poder conviver com isto e aplicá-los corretamente para resolver um determinado problema.
O conceito de corretude também é um ponto que deve ser flexibilizado. Nesses casos é desejável que o padrão seja corretamente identificado na grande maioria dos casos, mas é muito difícil garantir que isso sempre ocorra. Além disso, os requisitos mínimos para que se tenha a possibilidade do algoritmo funcionar devem estar bem definidos.
Ainda assim, é possível obter resultados bastante satisfatórios, que, se não funcionam exatamente 100% dos casos, já são um enorme avanço por funcionarem, digamos, em 90% das situações.
7. Referências bibliográficas
[1] E. Trucco, A. Verri, “Introductory Techniques for 3-D Computer Vision”, Prentice Hall, 1998.
[2] “CVonline - Compendium of Computer Vision”, http://www.dai.ed.ac.uk/CVonline/
[3] “Digital Image Processing: Chapter 5, Part II,
Segmentation: Edge-based segmentation”, http://www.icaen.uiowa.edu/~dip/LECTURE/Segmentation2.html#tracing
[4] “Image Processing Learning Resources”, http://www.dai.ed.ac.uk/HIPR2/