Wie wirkt sich die Größenänderung eines Bildes auf die intrinsische Kameramatrix aus?

18

Ich habe eine Kameramatrix (ich kenne sowohl intrinsische als auch extrinsische Parameter), die für Bilder der Größe HxB bekannt ist. (Ich benutze diese Matrix für einige Berechnungen, die ich brauche).

Ich möchte ein kleineres Bild verwenden, z. : (die Hälfte des Originals). Welche Änderungen muss ich an der Matrix vornehmen, um die gleiche Beziehung beizubehalten?H2×W2

Ich habe als die intrinsischen Parameter ( , Rotation und Translation)KTRT

cam=K[RT]

K=(ax0u00ayv0001)

a x a y u 0 v 0K ist 3 * 3, ich dachte beim Multiplizieren von , , und mit 0,5 (der Faktor, dessen Größe das Bild geändert hat), bin mir aber nicht sicher.axayu0v0

matlabit
quelle

Antworten:

13

Hinweis: Dies hängt davon ab, welche Koordinaten Sie im Bild mit geänderter Größe verwenden. Ich gehe davon aus, dass Sie ein auf Null basierendes System verwenden (Like C, Unlike Matlab) und 0 in 0 transformiert ist. Außerdem gehe ich davon aus, dass Sie keinen Versatz zwischen den Koordinaten haben. Wenn Sie einen Versatz haben, sollte dieser ebenfalls multipliziert werden

Kurze Antwort : Angenommen, Sie verwenden ein Koordinatensystem, in dem . Ja, Sie sollten mit multiplizieren 0,5.u=u2,v=v2ax,ay,u0,v0

Detaillierte Antwort Die Funktion, die einen Punkt in Weltkoordinaten in Kamerakoordinaten umwandelt lautet:P(x,y,z,1)>(u,v,S)

(ax0u00ayv0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

Wobei , da die Koordinaten homogen sind.(u,v,S)>(u/S,v/S,1)

Kurz gesagt kann dies geschrieben werden als wobei das Produkt der beiden oben erwähnten Matrizen ist und das i 'ist. ten Reihe der Matrix . (Das Produkt ist ein Skalarprodukt).u=m1Pm3P,v=m2Pm3P
MmiM

Das Ändern der Größe des Bildes kann gedacht werden:

u=u/2,v=v/2

Somit

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

Das Zurückkonvertieren in eine Matrixform gibt uns:

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

Welches ist gleich

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

Weitere Informationen finden Sie in Forsyth , Kapitel 3 - Geometrische Kamerakalibrierung.

Andrey Rubshtein
quelle
Vielen Dank für die Erklärung !!! Ich bin mir nur nicht sicher, was Sie unter einem auf Null basierenden System verstehen. Ich verwende Matlab. Benötige ich weitere Anpassungen?
Matlabit
@matlabit, Wenn Sie Matlab verwenden, sollten Sie die Transformation mit , da es eine einseitige Indizierung hat (First Element ist 1, nicht 0). Versuchen Sie in diesem Fall die relevante Matrix zu berechnen. Wenn Sie keine Subpixel-Genauigkeit benötigen, können Sie sie einfach ignorieren und die Formel verwenden, die ich Ihnen gegeben habe. u=(u1)/2+1,v=(v1)/2+1
Andrey Rubshtein
8

Andrey erwähnte, dass seine Lösung annimmt, dass 0 in 0 umgewandelt wird. Wenn Sie Pixelkoordinaten verwenden, ist dies wahrscheinlich nicht der Fall, wenn Sie die Größe des Bildes ändern. Die einzige Annahme, die Sie wirklich machen müssen, ist, dass Ihre Bildtransformation durch eine 3x3-Matrix dargestellt werden kann (wie Andrey gezeigt hat). Um Ihre Kameramatrix zu aktualisieren, können Sie sie einfach mit der Matrix vormultiplizieren, die Ihre Bildtransformation darstellt.

[new_camera_matrix] = [image_transform]*[old_camera_matrix]

2n

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

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

Dies kann durch die Matrix dargestellt werden

(2n02n1.502n2n1.5001)

also wäre deine endgültige kameramatrix

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

Hammer
quelle
Könnten Sie bitte erläutern, warum Sie 0,5 addieren und dann 0,5 subtrahieren? Gilt 0,5 nur für Skalierung mit Faktor ? Wenn nicht, wie berechnet man diese Subpixelzahl? 2n
Gurumonster
1
Ich denke, der Punkt ist, dass die Mitte des Pixels "0, 0" nicht wirklich bei "0, 0" liegt (= obere linke Ecke des Pixels), sondern bei "0,5, 0,5". Sie müssen also diesen Offset vor und nach der Transformation berücksichtigen, und der Faktor ist immer 0,5, unabhängig vom Skalierungsfaktor.
Jan Rüegg
Yup das ist genau richtig
Hammer