Este trabalho apresenta uma técnica simples baseada em rastreamento de pontos para a calibração de câmera e reconstrução de ruínas tridimensionais. Seu funcionamento baseia-se em cinco partes fundamentais:
Os passos (c) e (e) são idênticos, sendo que em (c) buscam-se pontos detectados que estejam próximos aos fornecidos pelo usuário e, em (e), buscam-se pontos detectados no novo quadro que estão mais próximos possíveis aos selecionados no quadro anterior. Desta forma ocorre um processo sistemático que se repete a cada quadro, envolvendo pontos selecionados no quadro atual (estados atual) e pontos selecionados em um próximo quadro.
O processo descrito envolve busca por pontos próximos dentre dois conjunto de pontos, o que necessariamente envolve a adoção de um parâmetro que indica o limite mínimo a partir do qual considera-se que pontos estão próximos o suficiente. Logo, há uma premissa implícita ao concebimento e funcionamento da técnica: a distância de um mesmo ponto em dois quadros consecutivos não pode exceder um determinado limite mínimo, caso contrário o ponto será considerado distante e não será utilizado para a calibração (pois resultaria em aumento do erro de calibração). Note também que não é possível utilizar um limite que seja demasiadamente grande, pois isso resultaria na seleção de pontos muito distantes dos pontos ideais para a calibração. Assim, a premissa de que a câmera deve ser movimentada suavemente deve ser respeitada para que a técnica funcione corretamente.
A implementação é dividida em cinco etapas, descritas abaixo.
Esta etapa é a etapa que inicia o work-flow. Os pontos de referência iniciais são na realidade um conjunto de pares de pontos da forma (Mk,Wk), onde Mk são pontos em coordenadas tridimensionais do modelo real (Model) e Wk são as respectivas coordenadas tridimensionais projetadas, escritas no espaço da janela (Window). Estes conjuntos de pontos são necessários para efetuar a calibração da camera, sendo necessário no mínimo oito pares de pontos (Mk,Wk).
Para o conjunto inicial de pontos de referência dados de forma relativamente precisa, é possível calibrar a camera de forma aceitável. Neste estágio inicial, temos a calibração pronta, mas ocorrer movimentação da camera, todos os pontos projetados escritos no espaço da janela (Wk) terão sua posição alterada. Para que seja possível calibrar novamente a camera, basta que se encontre a nova posição Wk de cada ponto do estado atual no novo estado oriundo do novo posicionamento da camera no mundo, já que cada ponto Mk associado a Wk não varia.
Para encontrar os pontos Wk em um novo estado foi utilizada uma técnica simples. Primeiramente detectam-se todos os pontos possíveis que satisfazem uma determinada característica específica. Neste caso se utilizou a característica de grande variação de gradiente, tipicamente presente em regiões de quina (Corner), mas seria possível utilizar outro tipo de característica, como a de semelhança dos píxels vizinhos ao píxel Wk. Tendo detectado todos os Corners possíveis, inicia-se o processo de rastreamento de pontos.
Dois algoritmos para detecção de Corners foram testados nesta implementação:
2.2.1. FAST Corner Detector [link]
Utiliza aprendizado de máquina e possui um banco de dados inicial já calibrado para detectar corners. Utiliza pouco recurso de CPU e se mostrou mais eficiênte do que o metodo de Kanade-Lucas-Tomasi. Contudo, é menos estável por não se basear em tracking de pontos: a detecção ocorre a cada quadro.
2.2.2. Kanade-Lucas-Tomasi Corner Detector (KLT) [link]:
Procura por diferenças grandes de gradiente da função de luminância para classificar pontos como corners. É mais eficaz que o primeiro método pois utiliza rastreamento de pontos baseando-se no principio de localidade, o que faz com que os pontos detectados se mantenham mais estáveis, mas, no entanto, utiliza mais recursos de CPU.
Após testes utilizando ambos os algoritmos, concluíu-se que o metodo KLT apresenta resultados mais estáveis de calibração de câmera.
Nesta etapa ocorre a busca por pontos do estado corrente que estejam mais próximos possíveis a Corners detectados no novo estado. Um valor de limite mínimo indica a partir de que distância pontos são considerados próximos o suficiente. No caso desta implementação utilizou-se a distância quadrática D=64, que representa uma distância euclidiana de 8 píxels.
Embora seja simples projetar uma algoritmo linear para busca de pontos mais próximos contidos em uma região discreta, utilizando um grid cartesiano, nesta implementação adotou-se um algoritmo quadrático em função do número de pontos, já que a quantidade de pontos em cada conjunto é relativamente pequena. Abaixo há um pseudo código do algoritmo utilizado.
Foreach corner Wi in trackedCorners:
nearestDist = INFINITY;
nearestElem = -1;Foreach corner Cj in detectedCorners:
If squaredDistance( Wi, Cj ) < nearestDist
nearestDist = squaredDistance( Wi, Cj );
nearestElem = j;
EndIf
EndForIf nearestDist <= MAX_SQUARED_DIST; /* = 64 */
Wi = C[nearestElem];
increaseConfidence( Wi, 0.1 ); /* Aumenta 10% a confiabilidade de Wi */
If confidence( Wi ) >= MIN_CONFIDENCE
pick( Wi );
Else /* Não há ponto em C próximo o bastante de Wi */
decreaseConfidence( Wi, 0.1 ); /* Diminui 10% a confiabilidade de Wi */
If confidence( Wi ) < MIN_CONFIDENCE
discard( Wi );
EndIf
EndForeach
Uma vez com um conjunto mínimo de pontos (Mk,Wk), podemos calibrar a camera. O método de calibração utilizado foi desenvolvido por Flávio Szenberg em sua tese de doutorado.
Após a calibração temos em mão os parametros intrínsecos e extrínsecos da câmera e somos capazes então de projetar objetos virtuais da mesma foram que os objetos reais foram projetado para gerar a imagem capturada pela câmera.
Possuir as matrizes que permitem projetar objetos virtuais em meio aos objetos reais não é suficiente para conseguir causar realismo quando o objetivo é reconstruir virtualmente parte de um objeto real. Isso porque o processo de reconstrução pode resultar em um situação em que ocorra oclusão entre parte do objeto real e parte do objeto virtual. Se estas situações não forem previstas e tratadas corretamente ocorrerá uma quebra abrupta de realismo durante a reconstrução no momento em que tais situações ocorrerem.
Para resolver o problema é preciso modelar precisamente o objeto na qual se deseja reconstruir (ruína). Isso porque com a ruína em mãos, pode-se lançar mão de um recurso eficiênte e de simples utilização: o buffer de profundidade da biblioteca gráfica OpenGL (Z-Buffer).
Um algoritmo simples que utiliza o Z-Buffer para solucionar o problema é apresentado a seguir.
Este algoritmo faz com que qualquer parte do modelo virtual que esteja sendo ocludido pela ruína real seja descartada, pois o modelo virtual da ruína tem coordenadas projetadas idênticas às coordenadas projetadas do modelo real da mesma, já que o ambos têm proporções precisamente iguais.
A técnica apresentada foi feita de forma a priorizar a simplicidade de implementação. Isso faz com que seja limitada e tenha um fator de instabilidade alto, pois deixa de explorar idéias que agregariam a ela eficiência e funcionalidade. Algumas limitações da técnica são apresentadas abaixo, bem como as técnicas que ajudam a diminuir essas limitações, que são colocadas aqui como trabalho futuro.
Última Atualização: 20/12/2006h