Objetivo
O
objetivo deste trabalho é fazer um programa que recebe uma sequencia de fotos
tiradas de um modelo tridimensional em diferentes ângulos, usando luz
estruturada, e partir destas imagens obter a nuvem de pontos em três dimensões
do objeto reconstruído.
2) Definição de pontos
correspondentes em imagens de vistas diferentes utilizando a geomteria
epipolar.
3) Triangulação dos
pontos correspondentes de forma a se obter o ponto tridimensional.
4)Geração e
visualização da nuvem de pontos.
Identificação e decodificação das
transições da luz estruturada na superfície do objeto
a) Pega o próximo pixel e seu vizinho direto à direita.
b) Se a diferença entre o valor do slide negativo e
positivo para a mesma posição de camera tiver sinais diferentes para estes dois
pixels vizinhos (em qualquer das 3 bandas (RGB)) então este é um pixel de
transição; caso contrário volta para (a).
c) Usando a função getBcslStripeCode
(Asla) recupera-se o código correspondente àquela transição. Esta função
recebe como entrada as duas cores das faixas identificadas no slide positivo 1
e as duas cores das faixas identificadas no slide positivo 2 e gera como saída
o código da transição. Vale lembrar que são duas imagens com padrões positivos
pois deseja-se codificar um numero grande de faixas, que não seria possivel com
apenas um padrão.
d) Na imagem de saída da função armazena-se na banda R o
valor 255, na G a precisão em sub-pixels, e na banda B o código da transição.





stereoEpipolarLineEquation((double) ponto.x,(double)
altura-ponto.y,F1,&a,&b,&c);
epiLine1[0]=a;
epiLine1[1]=b;
epiLine1[2]=c;
Feito isso percorre-se a
imagem B (em X, se tivermos a procura de transições verticais, ou em Y se as
transições forem horizontais – ambos foram implementados) e calcula-se o valor
Y resposta da reta epipolar para cada valor de X no dominio (largura da
imagem). Se o valor de Y estiver dentro da imagem (intervalo [0 altura]) e o
valor do pixel na banda de codigo for igual ao codigo do pixel em A fornecido
como entrada, então estes são pontos correspondentes.
//Percorre x
for
(i=0;i<largura;i++)
{
ret.x=(float)i;
ret.y=
(float)
floor(((epiLine1[0]*ret.x+epiLine1[2])/epiLine1[1]));
yP = altura-ret.y;
if ((altura > yP)&&(0 <= yP) &&
(imagem[
{
ret.x=(float)i;
ret.y=yP;
ret.z=imagem[ind-1];
//printf("reta mesmo :->
%lf,%lf,%lf\n",a,b,c);
return ret;
}
}


pontos :-> 444.160000,60.000000,447.000000,55
codigos faixa :-> 14.000000,14.000000
pontos :-> 417.050000,78.000000,418.000000,76
codigos faixa :-> 3.000000,3.000000
...
Triangulação dos pontos correspondentes
de forma a se obter o ponto tridimensional
Nesta
etapa o programa realiza a triangulação dos pontos correspondentes de forma a
obter as coordenadas tridimensionais dos pontos no mundo. A entrada desta etapa
é uma lista de pontos correspondentes e a saida é uma lista de pontos em
coordenadas do mundo.
int erro;
Vector eye_a =
algVector(a.cameraPosition.x,a.cameraPosition.y,a.cameraPosition.z,1);
Vector eye_b =
algVector(b.cameraPosition.x,b.cameraPosition.y,b.cameraPosition.z,1);
Vector pl =
stereoReconstruct(xa,ya,a.focalLenght,a.Ra,eye_a,a.w/2,a.h/2,
xb,yb,b.focalLenght,b.Ra,eye_b,b.w/2,b.h/2,&erro);
Vector Pw = pl;
if (erro) Pw.z = -1.0f;
return Pw;
Geração e visualização da nuvem de
pontos

============================================================================
============================================================================