![]() |
|
![]() |
|||||
Esta página será constantemente atualizada durante o curso. Última aualização: 12/12/07 |
|||||||
|
Trabalho 3 - Foto 3D
Resumo O intuito deste trabalho foi aplicar a técnica de Fotografia 3D para reconstrução de um modelo de um objeto, utilizando-se de fotos 2D obtidas de diversas orientações do objeto desejado. O setup utilizado, composto de 2 câmeras para obtenção de um par estéreo de fotos, e de um projetor responsável pela projeção da codificação de cores BCSL, proposto por Asla Medeiros Sá em sua tese de doutorado, permitiu a identificação de faixas de transição de cores. Depois, a partir de correspondência de pontos de transições horizontais e verticais, foi usada geometria epipolar para encontrar informação de profundidade a partir do par estéreo. Por fim, usou-se o algoritmo ICP para alinhamento das nuvens de pontos das várias vistas do objeto, e obteve-se uma malha de triângulos para finalizar a reconstrução do objeto desejado. Abaixo se encontra um detalhamento maior de cada fase da implementação e da técnica utilizada, bem como da teoria por trás de cada passo tomado para obtenção do resultado final.
|
||||||
Setup para fotografias Foram utilizadas duas câmeras para obtenção de pares estéreo de um objeto posicionado em cima de uma bancada giratória. Além das câmeras, foi utilizado também um projetor responsável pelo lançamento de um padrão de luz estruturada, explicado mais abaixo.
Calibração das câmeras Para obtenção dos parâmetros intrínsecos e extrínsecos de cada câmera do setup, foi utilizada uma foto de um tabuleiro de xadrez em cada uma das câmeras e posteriormente foi usado o método de Tsai 2D para calibração. O método utilizado para calibração individual de cada câmera está melhor descrito no Trabalho 2 dessa mesma disciplina.
Luz estruturada Na técnica de reconstrução 3D a partir de fotografias 2D (método conhecido como Photo 3D), é comum a utilização de luz estruturada para reduzir o número de imagens capturadas e reduzir a necessidade de processamento e armazenagem de informação. Basicamente, o método consiste em lançar, a partir um laser ou por um projetor, padrões de luz codificados, que permitam posterior obtenção de informação da superfície do objeto de interesse. Neste trabalho, a codificação de luz estruturada aplicada foi a 32-BCSL proposta por Asla Medeiros Sá em sua tese de doutorado. Nesta codificação, padrões de cor (chamados de slides) são projetados na superfície do objeto. Para identificação única de cada transição de faixa de cores, são usados no mínimo 2 slides positivos, como mostrado abaixo.
Além disso, para permitir que exista um realce das cores aplicadas, bem como remoção da contribuição da própria cor do material nas imagens capturadas (já que isso prejudica a identificação correta do relevo da superfície), são também aplicados padrões negativos no objeto, mostrados abaixo.
A subtração da informação de cor obtida através do slide negativo do slide positivo realça as cores do modelo, e a partir dai as transições de faixas de cor podem ser encontradas com maior facilidade. Além dos slides positivos e negativos com faixas horizontais mostradas acima, foi também aplicada a mesma sequência de slides, mas com as faixas na orientação vertical, como mostrado abaixo.
Esta ação torna viável a identificação de pontos únicos nas imagens, úteis no momento de encontrar informação de profundidade dos pontos, descrito mais abaixo neste documento.
Sequência de fotos Fazendo uso do setup e da luz estrutura explicados acima, foram tiradas séries de fotografias de um vaso, modelo escolhido para reconstrução. Com o vaso em uma determinada posição, tiraram-se 8 fotos do vaso na mesma posição, de cada câmera: com 2 slides positivos e 2 negativos para faixas horizontais, e o mesmo para slides com faixas verticais. Posteriormente o modelo foi rotacionado em alguns graus e o método foi repetido, e assim sucessivamente. Isso serve para permitir a reconstrução da superfície completa do objeto, remediando (mas não resolvendo por completo em alguns casos) o problema de oclusão em alguns pontos da superfície do objeto. É importante ressaltar que para que os dados destas fotos sejam de boa qualidade, é necessário que o fundo da foto (atrás do objeto desejado) não interfira na foto. Em outras palavras, o ideal é que a mesa onde o objeto se apóia seja coberto por um tecido preto, e a parte traseira ao vaso também o seja. Desse modo, somente o vaso em si refletirá a projeção dos slides de luz estruturada, e portanto na fase seguinte somente o modelo desejado contribuirá com informações de características de superficie. Neste projeto, este cuidado não foi tomado, e as fotos foram inclusive tiradas com outras luzes ambientes acesas, o que exigiu um pré-processamento manual das imagens para remoção de fundo não desejado das imagens que pudesse prejudicar o resultado final. Neste trabalho, foram tiradas então 8 fotos por câmera, 16 por ângulo do vaso, intercalando os ângulos de 20 em 20 graus, do 0º aos 140º, perfazendo portanto um total de 96 fotografias, que são utilizadas para obtenção da superfície do objeto conforme descrito mais abaixo.
Identificação das transições de faixa A identificação das transições de faixa é feita através de um processamento das imagens obtidas. Inicialmente é necessário realçar as cores projetadas no objeto, como mostrado no seguinte pseudo-código:
Para cada rotação de 0º a 140º, faça Depois disso, é necessário realmente encontrar as transições de faixas. Isso pode ser feito através da aplicação de um filtro Laplaciano nas imagens obtidas acima. Desse modo, somente as regiões de alta frequência (transições de faixa) permanecem nas imagens resultantes do laplaciano. Em outras palavras, a imagem resultante do laplaciano possui valor 1 em pixels que correspondem a uma transição de cores, e 0 caso contrário. Além disso, é feito um AND das imagens resultantes do laplaciano acima para imagens horizontais e verticais. A imagem resultante dessa operação possui 1 agora somente em pixels de cruzamentos de transições de faixas. Vale ressaltar a seguinte característica explorada na técnica acima: uma vez que cada transição de faixa horizontal pode ser identificada univocamente usando a codificação BCSL, e o mesmo pode ser feito para faixas verticais, se tomarmos a interseção entre elas, obtemos pontos univocamente identificáveis nas imagens de cada câmera. Isso reduz em muito o processamento necessário para identificação de pontos-chave na superfície e na posterior busca da profundidade deles. O processo agora consiste em varrer esta última imagem de interseção ou cruzamento de transições de faixas verticais e horizontais, buscando IDs das transições horizontais e verticais, usando a codificação BCSL. O pseudo-código abaixo resume essa etapa:
Para pixel da imagem de cruzamento de transicões de faixas, faça O processo acima armazena um mapa cuja chave é uma junção do ID de transição vertical com o ID da transição horizontal, e valor a posição x.y do pixel correspondente. Isso facilita na próxima etapa, de encontrar a profundidade dos pontos entre as duas câmeras.
Obtenção de informação de profundidade dos pontos Até o momento, temos para cada câmera um mapa com informações de pontos de interseção de transição e suas coordenadas x,y no espaço da imagem. Para obter a profundidade Z destes pontos, é necessário encontrar a correspondência entre pontos nas duas câmeras e fazer uso de geometria epipolar para calcular o Z. O pseudo-código explica o processo, e demonstra o poder do uso do mapa escolhido para bom desempenho no algoritmo: Para cada item do mapa da câmera 1, faça O processo acima basicamente utiliza-se do conceito de ignorar pontos que não possuem correspondência nas imagens das câmeras (o que acontece quando uma parte do objeto é capturado por uma câmera mas não por outra) e usando a correspondência, quando existente, para calcular a profundidade Z usando reconstrução por triangulação.
Alinhamento de pontos via ICP e obtenção da malha de triângulos
Neste ponto, possuímos uma série de núvens de pontos com informação espacial da superfície do objeto, uma nuvem para cada rotação do objeto de 0º a 140º. Agora se faz necessário que estas nuvens sejam alinhadas para obtenção do modelo completo do objeto. O algoritmo utilizado para o alinhamento dos pontos foi o ICP (Iterative Closest Points). Neste algoritmo, faz-se a aproximação de alinhamento entre dois conjuntos de pontos partindo de uma adivinhação inicial de translação e rotação de uma nuvem de pontos que a torne mais próxima (em termos de distância euclidiana entre um ponto em uma nuvem e o mais próximo da outra) da outra nuvem.
Por fim, com somente uma nuvem de pontos para o objeto todo, e usando-se do fato de o vaso ser simétrico e poder ser reconstruído inteiramente a partir somente dos ângulos de rotação de 0º a 140º usados para as fotos, é possível triangularizar esses pontos a fim de gerar uma malha de triângulos. Existem diversos métodos capazes de gerar malhas de triângulos a partir de uma sequência de pontos, incluindo Triangulação de Delaunay e Diagrama de Voronoy. Neste trabalho foi utilizada uma biblioteca já pronta para a triangulação dos pontos, presente no OpenSceneGraph.
Resultados e conclusão Os resultados obtidos foram satisfatórios, dado que todo o pipeline de reconstrução 3D foi estudado e implementado, mesmo que com a ajuda de bibliotecas prontas.
Trabalhos futuros Uma extensão a esse trabalho seria permitir a reconstrução em tempo real através da captura de uma câmera de vídeo. Mesmo já tendo sido implementado em outros trabalhos e portanto não se tratar de uma descoberta, esta técnica exercitaria outras habilidades e conhecimento dadas as novas dificuldades que teriam de ser enfrentadas. Abaixo pode ser obtido o código fonte utilizado no trabalho. O código está extensamente comentado, o que permite que a técnica toda explicada neste texto seja encontrada facilmente no código. |
|||||||
Download
|