Comment le redimensionnement d'une image affecte-t-il la matrice intrinsèque de la caméra?

18

J'ai une matrice de caméra (je connais les paramètres intrinsèques et extrinsèques) connue pour l'image de taille HxW. (J'utilise cette matrice pour certains calculs dont j'ai besoin).

Je souhaite utiliser une image plus petite, par exemple: (la moitié de l'original). Quels changements dois-je apporter à la matrice, afin de conserver la même relation?H2×W2

J'ai, comme paramètres intrinsèques, ( rotation , et translation)KRT

came=K[RT]

K=(uneX0u00uneyv0001)

K est 3 * 3, j'ai pensé à multiplier , , et par 0,5 (le facteur de redimensionnement de l'image), mais je ne suis pas sûr.a y u 0 v 0uneXuneyu0v0

matlabit
la source

Réponses:

13

Remarque: cela dépend des coordonnées que vous utilisez dans l'image redimensionnée. Je suppose que vous utilisez un système basé sur zéro (comme C, contrairement à Matlab) et que 0 est transformé en 0. De plus, je suppose que vous n'avez pas d'inclinaison entre les coordonnées. Si vous avez un biais, il doit également être multiplié

Réponse courte : en supposant que vous utilisez un système de coordonnées dans lequel u=u2,v=v2 , oui, vous devez multiplierax,ay,u0,v0par 0,5.

Réponse détaillée La fonction qui convertit un point P en coordonnées universelles en coordonnées de caméra (x,y,z,1)>(u,v,S) est:

(ax0u00ayv0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

(u,v,S)>(u/S,v/S,1) , puisque les coordonnées sont homogènes.

En bref, cela peut s'écrire u=m1Pm3P,v=m2Pm3P
Mest le produit des deux matrices mentionné cidessus, etmiest la iième rangée de la matrice deM. (Le produit est un produit scalaire).

Le redimensionnement de l'image peut être pensé:

u=u/2,v=v/2

Donc

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

La reconversion sous forme matricielle nous donne:

(0,50000,50001)(uneX0u00uneyv0001)(R11R12R13TXR21R22R23TyR31R32R33Tz0001)(Xyz1)

Qui est égal à

(0,5uneX00,5u000,5uney0,5v0001)(R11R12R13TXR21R22R23TyR31R32R33Tz0001)(Xyz1)

Pour plus d'informations, reportez-vous au chapitre 3 de Forsyth - Étalonnage de la caméra géométrique.

Andrey Rubshtein
la source
Merci beaucoup pour l'explication !!! Je ne sais pas trop ce que vous entendez par système à base zéro, j'utilise matlab, ai-je besoin d'autres ajustements?
matlabit
@matlabit, Si vous utilisez Matlab, vous devez utiliser la transformation avec , car il a une indexation à base unique (First l'élément est 1, pas 0). Essayez de calculer la matrice appropriée dans ce cas. Si vous n'avez pas besoin d'une précision inférieure au pixel, vous pouvez simplement l'ignorer et utiliser la formule que je vous ai donnée. u=(u-1)/2+1,v=(v-1)/2+1
Andrey Rubshtein
8

Andrey a mentionné que sa solution suppose que 0 est transformé en 0. Si vous utilisez des coordonnées de pixels, ce n'est probablement pas vrai lorsque vous redimensionnez l'image. La seule hypothèse que vous devez vraiment faire est que votre transformation d'image puisse être représentée par une matrice 3x3 (comme l'a montré Andrey). Pour mettre à jour la matrice de votre caméra, vous pouvez simplement la multiplier par la matrice représentant la transformation de votre image.

[new_camera_matrix] = [image_transform]*[old_camera_matrix]

Par exemple, disons que vous devez modifier la résolution d'une image d'un facteur et que vous utilisez 0 coordonnées de pixels indexées. Vos coordonnées sont transformées par les relations2n

X=2n(X+.5)-.5

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

cela peut être représenté par la matrice

(2n02n-1-.502n2n-1-.5001)

de sorte que votre matrice de caméra finale serait

(2n02n-1-.502n2n-1-.5001)(uneX0u00uneyv0001)

Marteau
la source
2n
1
Je pense que le fait est que le centre du pixel "0, 0" n'est pas vraiment à "0, 0" (= coin supérieur gauche du pixel) mais à "0,5, 0,5". Vous devez donc tenir compte de ce décalage avant et après la transformation, et le facteur est toujours de 0,5, quel que soit le facteur d'échelle.
Jan Rüegg
Yup c'est exactement ça
Hammer