Ich habe eine Hausaufgabe, in der ich einige Punkte mithilfe einer bestimmten Transformation berechnen und plotten muss, aber ich bin nicht sicher, ob meine Ergebnisse korrekt sind, da die 3D-Darstellung mit Kamerakoordinaten sehr anders aussieht als die 2D-Darstellung mit den Bildkoordinaten . Kannst du mir helfen zu verstehen, was los ist?
Dies ist gegeben: Die Kamera befindet sich am Punkt W T C = [ - 1 , 1 , 5 ] T , angegeben in Weltkoordinaten (in Metern). Das Kamerakoordinatensystem wird um die Y-Achse der Weltreferenz um & thgr ; = 160 ° gedreht , so dass seine Drehmatrix w R c = [ c o s ( & thgr; ) 0 s i n ( & thgr; ) 0 1 0 - s i n ist (
Kameraparameter sind: , s x = s y = 0,01 m m / p x , o x = 320 p x , o y = 240 p x
Beispielpunkte (in Weltkoordinaten):
Ich muss die Punkte in Kamerakoordinaten und in Bildkoordinaten berechnen und plotten, also habe ich den folgenden Code in Octave geschrieben:
%camera intrinsic parameters
f = 16
Sx = 0.01
Sy = 0.01
Ox = 320
Oy = 240
%given points, in world coordinate
wP1 = transpose([1, 1, 0.5])
wP2 = transpose([1, 1.5, 0.5])
wP3 = transpose([1.5, 1.5, 0.5])
wP4 = transpose([1.5, 1, 0.5])
% camera translation matrix
wTc = transpose([-1, 1, 5])
% rotation angle converted to rad
theta = 160 / 180 * pi
%camera rotation matrix
wRc = transpose([cos(theta), 0, sin(theta); 0, 1, 0; -sin(theta), 0, cos(theta)])
%transform the points to homogeneous coordinates
wP1h = [wP1; 1]
wP2h = [wP2; 1]
wP3h = [wP3; 1]
wP4h = [wP4; 1]
%separate each line of the rotation matrix
R1 = transpose(wRc(1 , :))
R2 = transpose(wRc(2 , :))
R3 = transpose(wRc(3 , :))
%generate the extrinsic parameters matrix
Mext = [wRc, [-transpose(R1) * wTc; -transpose(R2) * wTc; -transpose(R3) * wTc]]
%intrinsic parameters matrix
Mint = [-f/Sx, 0, Ox; 0, -f/Sy, Oy; 0, 0, 1]
% calculate coordinates in camera coordinates
cP1 = wRc * (wP1 - wTc)
cP2 = wRc * (wP2 - wTc)
cP3 = wRc * (wP3 - wTc)
cP4 = wRc * (wP4 - wTc)
% put coordinates in a list for plotting
x = [cP1(1), cP2(1), cP3(1), cP4(1), cP1(1)]
y = [cP1(2), cP2(2), cP3(2), cP4(2), cP1(2)]
z = [cP1(3), cP2(3), cP3(3), cP4(3), cP1(3)]
%plot the points in 3D using camera coordinates
plot3(x, y, z, "o-r")
pause()
% calculate the points in image coordinates
iP1 = Mint * (Mext * wP1h)
iP2 = Mint * (Mext * wP2h)
iP3 = Mint * (Mext * wP3h)
iP4 = Mint * (Mext * wP4h)
%generate a list of points for plotting
x = [iP1(1) / iP1(3), iP2(1) / iP2(3), iP3(1) / iP3(3), iP4(1) / iP4(3), iP1(1) / iP1(3)]
y = [iP1(2) / iP1(3), iP2(2) / iP2(3), iP3(2) / iP3(3), iP4(2) / iP4(3), iP1(2) / iP1(3)]
plot(x, y, "o-r")
pause()
Und dies sind die Handlungen, die ich aus dem Drehbuch erhalten habe: Ich hatte erwartet, dass sie sich etwas ähneln, aber sie sehen nicht so aus.
Zeichnen Sie die Kamerakoordinaten ein
Zeichnen Sie in Bildkoordinaten
quelle
Antworten:
Indem Sie Ihre Achsen in beiden Figuren identifizieren und die Kameraposition zu Ihrer ersten Figur hinzufügen, können Sie besser verstehen, was vor sich geht.
Eine gute Möglichkeit, Ihre Antwort zu überprüfen, ist die Verwendung eines vorhandenen 3D-Modellierers wie Blender: Seien Sie vorsichtig mit dem Blender-Koordinatensystem, z. B. mit dem Standardkameravektor
[0, 0, -1]
. Hier ist das Rendering: Focal wurde auf einen anderen Wert gesetzt, um die Kugel besser sichtbar zu machen. Wir sehen also, dass sich die beiden unteren Punkte in der mittleren Reihe des Bildes befinden und die Punkte etwas rechts vom Bild.Ich habe deine Hausaufgaben in Python umgesetzt:
Daraus ergeben sich folgende Zahlen: Jeweils: Weltkoordinaten, Kamerakoordinaten, Kamerakoordinaten , die so gedreht werden, dass sie leicht zur Kameraausrichtung passen (beachten Sie, dass der Kameravektor in Richtung des Ansichtspunkts der Figur geht und die Figur nicht "eingibt") und Bildkoordinaten.
Wir sehen also, dass die vertikalen Koordinaten für die unteren Punkte korrekt in der mittleren Zeile (240) und die Punkte auf der rechten Seite des Bildes liegen (horizontaler Wert> 320).
-f/Sxy
quelle