Calibração da câmera / modelo de câmera com furo de pino e elaboração da posição 3d

10

Eu tenho uma câmera calibrada e tenho os parâmetros intrínsecos. Eu também tenho os parâmetros extrínsecos relativos a um ponto (a origem do mundo) em uma superfície plana no mundo real. Este ponto que estabeleci como origem no mundo real coordena [0,0,0] com um normal de [0,0,1].

A partir desses parâmetros extrínsecos, posso determinar a posição e a rotação da câmera nas coordenadas 3d do plano mundial usando isso aqui: http://en.wikipedia.org/wiki/Camera_resectioning

Agora eu tenho um segundo ponto que extraí as coordenadas da imagem para [x, y]. Como obtenho agora a posição 3D deste ponto no sistema de coordenadas do mundo?

Acho que a intuição aqui é que preciso traçar um raio que vai do centro óptico da câmera (para o qual agora tenho a posição 3D conforme descrito acima), através do plano de imagem [x, y] da câmera e depois através do meu plano do mundo real, que defini no topo.

Agora eu posso cruzar um raio 3d de coordenadas mundiais com um avião, como eu sei normal e apontar para esse plano. O que não entendo é como descubro a posição e a direção 3d quando ela sai do plano da imagem através de um pixel. É a transformação através de diferentes sistemas de coordenadas que está me confundindo.

guepardo
fonte
Verifique esta resposta, pode ajudar. Se você acha que alguma coisa pode / pode ser concluída, basta me dizer. dsp.stackexchange.com/a/2737/1473
Jav_Rock

Respostas:

6

Se você tem os extrínsecos, é muito fácil. Ter extrínseca é o mesmo que ter "pose de câmera" e o mesmo que ter homografia. Verifique esta postagem no stackoverflow.

Você tem elementos extrínsecos, também chamados de pose da câmera, que são descritos como tradução e rotação:

Pose=[R|t]=[R11R12R13txR21R22R23tyR31R32R33tz]

Você pode obter Homografia da Pose desta maneira:

H=1tz[R1xR2xtxR1yR2ytyR1zR2ztz]

Em seguida, você pode projetar seus pontos 2D nos pontos 3D correspondentes, multiplicando a homografia pelos pontos:

p2D=[xy1] addz=1 para torná-los homogêneos

p3D=Hp2D

p=p/p(z) Normalize os pontos

Jav_Rock
fonte
o que você quer dizer com p (z) aqui?
Belal Homaidan 30/03
3

Você tem duas opções: use retroprojeção ou projeção entre dois planos (homografia).

Na retroprojeção, você pega uma pseudo inversa da matriz da sua câmera e multiplica o resultado com sua apresentação homogênea do ponto da imagem:P

P=K[RRC]Xreprojected=P+x

CXV=ω[XYZ1]Tω=1

u=XreprojectedCv=uuL(t)=C+tv

Se você tiver o plano poderá resolver a equação para .L ( t ) = Π tΠ=[π1π2π3π4]T,π1X+π2Y+π3Z+π4=0L(t)=Πt

Se você optar por usar a homografia, precisará calcular a matriz de homografia definida como projeção entre o plano da imagem e o plano do sensor da câmera:H3×3H

Xplane=[XY01]Tx=PXplane=H[XY1]T

x

Xplane=H1x

H

H=R+1dTNT

dT=RC

buq2
fonte
2

Você não pode saber a posição 3d do segundo ponto. Pode ser qualquer um dos pontos no raio do centro da câmera até o infinito.

Você pode fazer o seguinte:

  • Crie um espaço 3D predefinido que se assemelhe à cena da vida real
  • Obtenha mais pontos de imagens de um ângulo diferente. Usando a interseção dos raios de diferentes ângulos, é possível obter uma aproximação do ponto 3D.
Geerten
fonte
Espere. Posso encontrar o ponto do mundo 3d em que o raio 3d cruza a superfície plana, com certeza? Como eu conheço uma coordenada do mundo 3d e um mundo 3d normal desse plano ... o ponto 3d que estou tentando encontrar é o ponto que cruza a superfície plana !! (Desculpe, eu sinto que minha explicação não foi boa o suficiente) #
Cheetah Cheetah
O que você quer dizer com superfície plana? O plano da imagem, ou o plano do mundo zero, coordena? No caso deste último, você pode calcular a interseção, mas isso significa que sua cena 3d não é 3d, mas 2d :) (porque é um avião).
Geerten 30/03
Sim, desculpe, isso simplesmente não me ocorreu. Entendo o que você está dizendo, isso realmente não faz sentido para mim visualmente. Então, sim, minha cena é na verdade "2d" porque eu tenho o plano da imagem e o plano do mundo real, no qual a origem do mundo real [0,0,0] se encontra e tem um mundo real normal de [0,0, 1], portanto, todo ponto que se encontra neste plano do mundo real tem a forma de [x, y, 0]. Eu sei que posso calcular a interseção através de ax + by + cz + d = 0, mas é com isso que estou tendo problemas. (Para ser continuado no próximo comentário)
Cheetah
Eu tenho um raio que começa no centro / origem da câmera e tenho o mundo real [x, y, z] e um mundo real normal [nx, ny, nz]. Eu preciso disparar um raio a partir deste ponto que intercepta o plano da imagem em [u, v] e depois intercepta o plano do mundo real em [x, y, 0] (é esse x, y que eu quero obter). Estou tendo problemas com o primeiro bit, a interseção com o plano da imagem. Não consigo ver como faço isso?
Cheetah
Você pode querer consultar: en.wikipedia.org/wiki/Line-plane_intersection
Geerten