Para começar com a definição, a reconstrução é um modelo 3D de um objeto desenvolvido com base no processamento de dados de longo alcance. A reconstrução pode ser feita usando uma grande variedade de princípios: estereométrica, estereofotométrica, remoção de volume ou dados de movimento.

Este trabalho é um guia que explica como desenvolver uma aplicação simples para reconstruir uma forma de objeto usando GPU, ou seja, uma placa de vídeo.

Dentre os princípios mencionados acima, escolhemos o algoritmo de remoção de volume, sugerido por Brian Cureless e Mark Levoy em seu artigo intitulado “A Volumetric Method for Building Complex Models from Range Images”.

A figura abaixo esclarece o princípio básico do algoritmo. O objeto a ser reconstruído a partir de um conjunto de imagens é mostrado à esquerda. Ao processar uma imagem, o algoritmo remove os pontos 3D localizados na frente do objeto (os autores aplicaram a técnica da luz estruturada para o mapeamento de profundidade), e além dele. O resultado do primeiro processamento da foto é mostrado no centro. Usando os dados obtidos da 2ª câmera, o programa apaga pontos 3D adicionais. Quanto mais ângulos forem utilizados, mais pontos 3D extras são removidos; no final, apenas os pontos pertencentes ao objeto permanecem.

Na aplicação, implementamos uma versão simplificada do algoritmo que apaga apenas os pontos localizados além do contorno do objeto nas imagens. Seguindo o artigo original, dividimos todo o espaço em um conjunto de elementos cúbicos (voxels).

Para determinar se um voxel pertence ao objeto 3D, aplicamos a renderização da GPU e combinamos a projeção obtida com a silhueta do objeto.

Para obter a projeção, a seguinte função é usada:

Para explicar com mais detalhes,

pixelBuffer->makeCurrent () – muda o conteúdo do desenho para o buffer QGLPixelBuffer fora da tela.

Ao inicializar o buffer de saída, clipping, teste de profundidade e mistura são desabilitados, já que o único objetivo é determinar a posição espacial do voxel em relação ao objeto.

Após trocar o conteúdo no HComparator::render, o buffer de saída é limpo e os parâmetros de projeção são definidos.

Para renderizar um voxel, a função glCallList(voxelList) é chamada para executar uma lista pré-formada de comandos. A função de inicialização é:

Após o desenho, a posição espacial do voxel em relação ao objeto é determinada usando a função HComparator::compareData.

A função compareData copia o conteúdo do buffer e o compara com a silhueta do objeto baseado nas três opções possíveis (veja a figura abaixo):

a) o voxel está inteiramente localizado dentro do objeto (código 1);

b) o voxel pertence à borda (código 2);

c) o voxel está inteiramente localizado além do objeto (código 0).

O conjunto de ângulos usados para desenvolver o modelo 3D é processado sequencialmente pela função HReconstruction::process. Partimos da hipótese de que cada um dos voxels pertence ao objeto. Se a localização de um voxel for determinada além do objeto para um dos ângulos, seu processamento pára e ele é removido do modelo. Todo o processamento é realizado até que todos os ângulos sejam considerados. No final, apenas os voxels pertencentes ao modelo do objeto permanecem.

Para combinar o voxel e a silhueta do objeto, os parâmetros de projeção devem ser conhecidos. Eles são definidos pelas matrizes GL_PROJECTION e GL_MODELVIEW (ver a função setGL).

A matriz GL_PROJECTION é definida pelos parâmetros da câmera, especificamente, a distância focal e o tamanho da imagem (a função HFrame::loadIntrisicParameters).

A posição 3D da câmera pode ser determinada usando o marcador de realidade aumentada, nós a retiramos da biblioteca aruco. O marcador é uma imagem especial para ser impressa em um pedaço de papel (veja a figura abaixo).

Ao fotografar um objeto, o marcador deve ser mantido imóvel e entrar no campo de visão da câmera em cada uma das fotos do objeto.

>

A biblioteca detecta os pontos de controle do marcador, e então, usando a distância focal da câmera, calcula a posição do marcador 3D (rvec e tvec).

Os parâmetros rvec e tvec determinam a matriz GL_MODELVIEW (ver a função HFrame::loadExtrisicParameters).

Assim, aprendemos como projectar voxels no plano da imagem, determinar a posição do voxel em relação à imagem do objecto, calcular os parâmetros de projecção e determinar se o voxel pertence ao volume do objecto, através do processamento dos dados de várias câmaras; esta é uma técnica simplificada mas completa para a reconstrução de objectos 3D.

Leave a comment

O seu endereço de email não será publicado.