Обратная проекция 2D в 3D не работает должным образом
В настоящее время я пытаюсь реализовать ядро второго алгоритма, реализованного в этой статье (p5-8, p17-20) в Matlab, в качестве прототипа для более крупного проекта, который требует определения высоты объекта. Алгоритм закодирован, однако данный вывод далеко не верен для любых данных, которые я даю.
После сбоя я попытался получить несколько параметров, используя метод, описанный в разделе 3.2.2, и несколько раз следил за выводом. Я, вероятно, упускаю что-то вроде неправильного понимания системы координат. Если бы кто-нибудь мог дать мне представление о каких-либо заблуждениях или ошибках, которые я сделал, я был бы бесконечно благодарен.
Данные, объект и код приведены ниже. Обратите внимание, что камера, которую я использую, - это Fujifilm FinePix S4000, и все используемые измерения приведены в метрах или градусах. Большинство параметров приведены в основном алгоритме.
Главный alg:
clear
clc
R = [3072 2304]; %x,y dimensions of image
c0 = [1472, 1616]; %base point (floor, Z point = 0)
c1 = [1472, 728]; %top of object (should be ~14.5cm or 0.145m)
f = 0.0043; %focal length
T = [0;0;0.07175]; %Camera position (start of co-ord system except height)
cmos_x = 0.00616; %CCD x dimension = 6.16mm (I think)
cmos_y = 0.00462; %CCD y dimension = 4.62mm (I think)
tilt = 0; %perpendicular to floor
gamma_x = 2*atand(cmos_x/(2*f));
gamma_y = 2*atand(cmos_y/(2*f));
[Rx_theta, r] = r_calc(c0, R, gamma_x, gamma_y, tilt); %Rx_theta is unused - was for a test
t = T(3,1)/-r(3,1); %t=z0/-c, gotten from Z
X = T(1,1) + r(1,1)*t; %should be common between points 1 and 2 - typically not?
Y = T(2,1) + r(2,1)*t; %""
Z = T(3,1) + r(3,1)*t; %check is 0
[Rx_theta1, r1] = r_calc(c1, R, gamma_x, gamma_y, tilt);
Z1 = T(3,1) + r1(3,1)*t; %height
vpa(Z1-Z, 10) %Z = 0
Функция для r_calc:
function [Rx_theta,r] = r_calc(p,R,gamma_x,gamma_y,tilt)
syms theta
beta = -(p(1,1)/R(1,1))*gamma_x;
alpha = -(p(1,2)/R(1,2))*gamma_y+tilt;
Rx = [1 0 0; 0 cosd(theta) -sin(theta); 0 sin(theta) cos(theta)];
Rz = [cosd(theta) -sind(theta) 0; sind(theta) cosd(theta) 0; 0 0 1];
rs = [0; 1; 0];
Rx_theta = subs(Rx, theta, alpha);
Rz_theta = subs(Rz, theta, beta);
r = Rx_theta*Rz_theta*rs;
end
Объект 14,5 см, 30 см от камеры, высота камеры 4 см, диаметр объектива 6,35 см: