Como o redimensionamento de uma imagem afeta a matriz intrínseca da câmera?

18

Eu tenho uma matriz de câmera (conheço parâmetros intrínsecos e extrínsecos) conhecidas por imagens de tamanho HxW. (Eu uso essa matriz para alguns cálculos que preciso).

Quero usar uma imagem menor, digamos: (metade do original). Que mudanças eu preciso fazer na matriz para manter a mesma relação?H2×W2

I têm, como a parâmetros intrínsecos, ( , rotação e tradução)KTRT

cam=K[RT]

K=(ax0u00ayv0001)

K é 3 * 3, pensei em multiplicar , , e por 0,5 (o fator em que a imagem foi redimensionada), mas não tenho certeza.a y u 0 v 0axayu0v0

matlabit
fonte

Respostas:

13

Nota: Isso depende de quais coordenadas você usa na imagem redimensionada. Estou assumindo que você está usando um sistema baseado em zero (como C, ao contrário Matlab) e 0 é transformado em 0. Além disso, estou assumindo que você não tem inclinação entre coordenadas. Se você tem uma inclinação, ela deve ser multiplicada também

Resposta curta : Supondo que você esteja usando um sistema de coordenadas no qual , sim, você deve multiplicar por 0,5u=u2,v=v2ax,ay,u0,v0

Resposta detalhada A função que converte um ponto nas coordenadas mundiais em coordenadas da câmera é:P(x,y,z,1)>(u,v,S)

(ax0u00ayv0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

Onde , uma vez que as coordenadas são homogêneas.(u,v,S)>(u/S,v/S,1)

Em resumo, isso pode ser escrito como que é o produto das duas matrizes mencionadas acima e é o i ' th linha da matriz . (O produto é um produto escalar).u=m1Pm3P,v=m2Pm3P MmiM
MmiM

O redimensionamento da imagem pode ser pensado em:

u=u/2,v=v/2

portanto

u=(1/2)M1PM3Pv=(1/2)M2PM3P

A conversão de volta para a forma de matriz nos fornece:

(0.50000.50001)(ax0u00ayv0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

Qual é igual a

(0.5ax00.5u000.5ay0.5v0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

Para informações adicionais, consulte Forsyth , capítulo 3 - Calibração geométrica da câmera.

Andrey Rubshtein
fonte
Muito obrigado pela explicação !!! Não sei ao certo o que você quer dizer com sistema baseado em zero. Estou usando o matlab. Preciso de outros ajustes?
matlabit
@matlabit, Se você estiver usando o Matlab, use a transformação com , pois ele possui indexação baseada em uma (Primeira elemento é 1, não 0). Tente calcular a matriz relevante neste caso. Se você não precisa de precisão sub-pixel, basta ignorá-lo e usar a fórmula que eu forneci. u=(u1)/2+1,v=(v1)/2+1
precisa saber é o seguinte
8

Andrey mencionou que sua solução assume que 0 é transformado em 0. Se você estiver usando coordenadas de pixel, provavelmente isso não é verdade quando você redimensiona a imagem. A única suposição que você realmente precisa fazer é que sua transformação de imagem possa ser representada por uma matriz 3x3 (como Andrey demonstrou). Para atualizar a matriz da câmera, basta pré-multiplicá-la pela matriz que representa a transformação da imagem.

[new_camera_matrix] = [image_transform]*[old_camera_matrix]

Como exemplo, suponha que você precise alterar a resolução de uma imagem por um fator e esteja usando 0 coordenadas de pixel indexadas. Suas coordenadas são transformadas pelos relacionamentos2n

x=2n(x+.5).5

y=2n(y+.5).5

isso pode ser representado pela matriz

(2n02n1.502n2n1.5001)

então sua matriz de câmera final seria

(2n02n1.502n2n1.5001)(ax0u00ayv0001)

Martelo
fonte
Você poderia explicar por que você adiciona 0,5 e depois subtrai 0,5? 0.5 aplica-se apenas à escala com um fator ? Caso contrário, como calcular esse número de sub-pixel? 2n
Gurumonster
1
Eu acho que o ponto é que o centro do pixel "0, 0" não está realmente em "0, 0" (= canto superior esquerdo do pixel), mas em "0,5, 0,5". Portanto, você deve contabilizar esse deslocamento antes e depois da transformação, e o fator é sempre 0,5, independentemente do fator de escala.
Jan Rüegg 02/02
Sim, é exatamente isso
Hammer