Requer MS Visual Studio 2005.
O objetivo deste trabalho é gerar uma representação tridimensional de um objeto real fotografado em estéreo com luz estruturada. O processo consiste em identificar os pontos de transição de cor da luz projetada sobre o objeto, e então cruzar os resultados das duas câmeras para reconstruir a posição tridimensional destes pontos.
Fotos estéreo
Duas câmeras calibradas com posições ligeiramente diferentes são usadas para tirar fotos do objeto sob vários ângulos. Inicialmente, tentamos câmeras reais, mas não obtivemos a precisão necessária na calibração para que as fotos dessem resultados de boa qualidade. Então, fotos sintéticas foram criadas no OpenGL com valores de calibração de câmera conhecidos, para ângulos de 0° a 330°, em incrementos de 30°.

Sabendo-se as coordenadas em pixel de um ponto do objeto nas fotos de cada câmera, podemos triangular sua posição no espaço do mundo. Para que a associação de coordenadas entre as fotos estéreo seja feita, precisamos marcar o objeto com padrões facilmente reconhecíveis.

Luz estruturada
A marcação dos objetos para este trabalho é feita com luz estruturada. Para cada ângulo, faixas coloridas são projetadas sobre o objeto. Estas faixas obedecem ao padrão (3,2)-BCSL com Asla Coding, visto abaixo:
São dois padrões distintos de cores (à esquerda) e seus correspondentes em negativo (à direita). A função das imagens em negativo é facilitar a identificação das faixas de cor, que podem ficar prejudicadas por imprecisões no projetor ou interferência da cor do objeto.
Desta forma, é possível correlacionar as faixas onde ocorrem transição de cor nas imagens estéreo. O problema é que elas dão um grau de liberdade (temos a coordenada x da transição, mas a y é livre para toda a faixa). Para solucioná-lo, existem duas opções:
Geometria Epipolar: Dedução do ponto de
cruzamento das duas imagens a partir da geometria e parâmetros das
câmeras. Exige um certo trabalho de cálculos matemáticos.

Faixas Horizontais: Além dos padrões de faixas
verticais, são projetadas faixas horizontais. Os pontos onde as transições
verticais e horizontais se cruzam podem então ser identificados. Esta foi a
alternativa escolhida para este trabalho, por ser de simples implementação.

Pontos de transição
Para decodificar as faixas de transição nas imagens de entrada, o seguinte algoritmo é executado:
A imagem negativa de cada padrão é subtraída de sua respectiva imagem positiva. Este passo ajuda a tornar as faixas de transição mais nítidas e sem interferência da cor do objeto.
A imagem resultante é varrida pixel a pixel. Cada um é classificado pela cor que mais se aproxima (vermelho, verde ou azul). Quando uma variação de cor é encontrada, estamos numa faixa de transição. A função getBcslStripeCode recebe a cor das faixas vizinhas à transição dos dois padrões, retornando o código único da transição. A imagem de saída contém em seus canais RGB os valores (255, 255, código).
Em posse das faixas de transição verticais, o processo é repetido para as faixas horizontais. Assim, elas podem ser cruzadas de maneira a se obter pontos de transição nas interseções.
As coordenadas dos pontos de transição são armazenadas numa matriz indexada pelos códigos de transição vertical e horizontal. Para as imagens utilizadas neste trabalho, foi necessário um tratamento adicional para as faixas horizontais, porque o número de faixas projetadas é maior que as disponíveis no (3,2)-BCSL, levando a uma repetição do padrão que causaria conflitos entre os pontos encontrados. Assim, o código das transições horizontais é diferenciado também pela metade vertical da imagem em que o pixel se encontra.
Algumas imagens resultantes deste processo estão ilustradas abaixo:
![]() |
![]() |
![]() |
|
Reconstrução 3D
O conjunto de pontos de transição obtidos para cada câmera precisa ser agora convertido para as coordenadas do mundo. Para isso, a função stereoReconstruct é utilizada. Ela recebe as coordenadas dos pontos de transição das duas câmeras e seus parâmetros de calibração (distância focal e matriz de rotação). Seu valor de retorno é o ponto em coordenadas 3D.

Ao final desta etapa, obtemos uma nuvem de pontos para cada ângulo de visão. A nuvem de pontos completa também é gerada, juntando-se cada nuvem rotacionada inversamente pelo seu ângulo. A visualização destes pontos pode ser feita com o programa Arc Ball View, fornecido pelo prof. Gattass.


Fica para um trabalho futuro a otimização do número de pontos da nuvem e a geração de sua malha de triângulos.