У меня есть домашнее задание, в котором я должен рассчитать и построить некоторые точки с использованием предполагаемого преобразования, но я не уверен, что мои результаты верны, так как 3D-график с использованием координат камеры выглядит очень отличающимся от 2-го графика с использованием координат изображения , Можете ли вы помочь мне понять, что не так?
Вот что дано: Камера находится в точке , указанной в мировых координатах (в метрах). Система координат камеры вращается вокруг оси Y мировой системы координат на , поэтому ее матрица вращения имеет вид θ = 160 o W R c = [ c o s ( θ ) 0 s i n ( θ ) 0 1 0 - s i n ( θ ) 0 c o s ( θ ) ]
Параметры камеры: , , ,ы х = ы у = 0,01 м м / р х о х = 320 р х о у = 240 р х
Точки выборки (в мировых координатах):
Я должен рассчитать и построить точки в координатах камеры и в координатах изображения, поэтому я написал следующий код в Octave:
%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()
И это сюжеты, которые я получил из сценария: я ожидал, что они будут несколько похожи, но они не выглядят так.
График в координатах камеры
График в координатах изображения
источник
Ответы:
Определение ваших осей на обеих фигурах и добавление положения камеры к первой фигуре поможет вам понять, что происходит.
Хороший способ проверить свой ответ - использовать существующий 3D-моделлер, такой как Blender: будьте осторожны с системой координат Blender, например, вектором камеры по умолчанию является
[0, 0, -1]
. Вот рендер: Focal было установлено другое значение, чтобы сфера была более видимой. Итак, мы видим, что две нижние точки находятся в среднем ряду изображения, а точки немного правее изображения.Я реализовал вашу домашнюю работу на Python:
Это дает мне эти цифры: соответственно: мировые координаты, координаты камеры, координаты камеры повернуты, чтобы немного соответствовать ориентации камеры (обратите внимание, что здесь вектор камеры идет к точке обзора фигуры, она не «вводит» фигуру) и координаты изображения.
Итак, мы видим, что вертикальные координаты для нижних точек правильно находятся в среднем ряду (240), а точки находятся на правой стороне изображения (горизонтальное значение> 320).
-f/Sxy
источник