Computação Gráfica II 
Prof. Márcio Sarroglia Pinho

Exercício de Reconstrução 3D com Duas Câmeras




O objetivo deste exercício obter a profundidade de uma cena com base em imagens de duas câmeras posicionadas lado a lado.

Para ler uma arquivo de imagem e realizar a manipulação do pixels, utilize a biblioteca ImageClass, disponível nesta página.

Comparação de Imagens

Para comparar os pixels das imagens, utilize a as métricas como a SAD - Sum of Absolute Diferences.
    http://en.wikipedia.org/wiki/Sum_of_absolute_differences

Algoritmo de Reconstrução

A ideia principal do algoritmo de reconstrução é analisar a imagem da esquerda linha a linha e, para cada ponto ImgEsq[LinhaY][X],  identificar, na mesma linha da imagem da direita, a posição horizontal do ponto(ou de um muito "parecido" com ele),
dentro de um intervalo de N pixels.

Para comparar o ponto da imagem da esquerda, com os pontos da imagem direita, usa-se o SAD de forma encontrar o ponto mais parecido com o ponto ImgEsq[Linha][X].

Na imagem a seguir, por exemplo, o canto inferior direito da face frontal do cubo aparece em duas imagens, sendo que, na imagem da direita ele aparece mais à esquerda.

Figura - Exemplo de disparidade
Quando o algoritmo encontrar este ponto na posição ImgDir[LinhaY][Xdir], deve calcular a diferença entre as coordenadas X do ponto nas duas imagens, determinando a disparidade.
disparidade = X-Xdir.

Pode ocorrer que, no intervalo de busca na imagem da direita, nenhum pixel seja muito "parecido" com o pixel que se está buscando. Neste caso, a disparidade deve ser setata para 0.

Note que a busca deve ser iniciada na imagem da direita a partir da mesma posição do ponto na imagem da esquerda e fazer a busca em direção ao início da linha.


O valor calculado da disparidade deve ser armazenado em uma matriz de inteiros do mesmo tamanho da imagem.

MatDisp[LinhaY][X] = disparidade

Depois de processada toda a imagem a matriz, a matriz de disparidade deve ser varrida de forma a obterem-se o maior e menor valores dentro dela. Com estes valores, deve-se fazer uma escala na matriz de forma que os valores fiquem no intervalo entre [0..255].

Ao final, as entradas da matriz devem ser copiadas para uma imagem, usando a disparidade como sendo a cor do pixel.

cor =
MatDisp[Y][X]
Imagem.DrawPixel(X,Y,cor, cor,cor)


Apresentação dos Resultados

Os resultados devem ser apresentados na forma de imagens exibidas simultaneamente, como um Mapa de Profundidade, mostrando a profundidade dos pixels em tons de cinza. Quando mais distante da câmera estiver um pixel, mais escuro este deve ser exibido, quanto mais próximo da câmera, mais claro.


Exemplo de Mapa De Profundidade

Exemplos de Imagens para testes

    Para realizar o exercício, salve as imagens coloridas apresentadas a seguir e realize o processamento sobre elas.










FIM.