Saya punya pekerjaan rumah di mana saya harus menghitung dan memplot beberapa poin menggunakan transformasi pespektif, tetapi saya tidak yakin hasil saya benar, karena plot 3d menggunakan koordinat Kamera terlihat sangat berbeda dari plot 2d menggunakan koordinat gambar . Bisakah Anda membantu saya memahami apa yang salah?
Inilah yang diberikan: Kamera berada pada titik W T C = [ - 1 , 1 , 5 ] T , ditentukan dalam koordinat dunia (dalam meter). Sistem koordinat kamera diputar di sekitar sumbu Y dari referensi dunia oleh , sehingga matriks rotasinya adalahw R c = [ c o s ( θ ) 0 s i n ( θ ) 0 1 0 - s i n ( θ ) 0 c o s ( θ ) ]
Parameter kamera adalah: , s_x = s_y = 0,01 mm / px , o_x = 320 px , o_y = 240pxs x = s y = 0,01 m m / p x o x = 320 p x o y = 240 p x
Poin sampel (dalam koordinat dunia):
Saya harus menghitung dan memplot poin dalam koordinat kamera dan dalam koordinat gambar, jadi saya menulis kode berikut dalam Oktaf:
%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()
Dan ini adalah plot yang saya dapatkan dari skrip: Saya berharap mereka agak mirip, tetapi mereka tidak terlihat begitu.
Plot dalam koordinat kamera
Plot dalam koordinat gambar
sumber
Jawaban:
Mengidentifikasi sumbu Anda di kedua gambar dan menambahkan posisi kamera ke angka pertama Anda akan membantu Anda memahami apa yang terjadi.
Cara yang baik untuk memeriksa jawaban Anda adalah dengan menggunakan pemodel 3D yang sudah ada seperti Blender: Berhati-hatilah dengan sistem koordinat Blender, misalnya vektor kamera defaultnya
[0, 0, -1]
. Inilah rendernya: Focal diatur ke nilai lain untuk membuat bola lebih terlihat. Jadi kita melihat bahwa dua titik bawah berada di baris tengah gambar dan titik-titiknya sedikit di sebelah kanan gambar.Saya menerapkan pekerjaan rumah Anda dengan Python:
Ini menghasilkan angka-angka itu: Masing-masing: Koordinat dunia, Koordinat kamera, Koordinat kamera diputar agar pas sedikit dengan orientasi kamera (perhatikan bahwa di sini vektor kamera mengarah ke sudut pandang gambar, itu tidak "memasukkan" gambar) dan koordinat gambar.
Jadi kita melihat bahwa koordinat vertikal untuk titik-titik bawah benar di baris tengah (240) dan titik-titiknya ada di sisi kanan gambar (nilai horizontal> 320).
Saya percaya satu bug yang Anda miliki adalah bahwa Anda menemukan nilai X negatif, sehingga Anda meniadakan focals ([0,0,1] x
-f/Sxy
) dalam matriks intrinsik untuk mengompensasi. Masalahnya di sini adalah kita mengasumsikan bahwa kamera pada awalnya mengarah ke (jika tidak, rotasi 160 ° tidak akan mengarah ke titik). Jika Anda melihatnya seperti itu, sumbu meningkat ketika menuju ke kiri , kebalikan dari sumbu ini harus diambil.xKedua hasil kami tampaknya mirip dengan saya, hanya saja Anda menduga vektor untuk kamera (sebenarnya kedua sumbu dicerminkan karena Anda meniadakan kedua fokus), dan melakukan perhitungan dalam mm bukannya meter.[0,−1,0]
sumber