fig3
test back projection with multiple points
cam1.pos = [10 2 5]; cam1.target = [0 0 0]; scl = 2; cam2.pos = [2 10 5]; cam2.target = [0 0 0]; pt = [4 8 3; 4 6 2; 2 3 0.1; 1 2 4]; [N M] = size(pt); [x y z] = sphere; ps = 2; figure(1); cam1 = cam_obj(cam1,scl); daspect([1 1 1]); view(135,60); grid; hold on for k=1:N surf(x/ps+pt(k,1),y/ps+pt(k,2),z/ps+pt(k,3)); end text(cam1.pos(1),cam1.pos(2),cam1.pos(3),'1','FontSize',16); [img1 invpt1] = cam_plot(cam1,pt,'g'); cam2 = cam_obj(cam2,scl); text(cam2.pos(1),cam2.pos(2),cam2.pos(3),'2','FontSize',16); [img2 invpt2] = cam_plot(cam2,pt,'g'); hold off axis equal xlabel('x axis'); ylabel('y axis'); zlabel('z axis');
figure(2); subplot(1,2,1); plot(img1(:,1),img1(:,2),'ko','MarkerSize',10,'MarkerFaceColor','g'); grid axis([-scl scl -scl scl]); axis square title('camera 1'); subplot(1,2,2); plot(img2(:,1),img2(:,2),'ko','MarkerSize',10,'MarkerFaceColor','g'); grid axis([-scl scl -scl scl]); axis square title('camera 2');
% test back projection equations C = cam2.pos - cam1.pos; for k=1:N k1 = invpt1(k,:) - cam1.pos; k2 = invpt2(k,:) - cam2.pos; A = [dot(k1,k1) -dot(k1,k2); -dot(k1,k2) dot(k2,k2)]; b = [dot(k1,C); -dot(k2,C)]; q = A\b; P1 = cam1.pos + q(1)*k1; P2 = cam2.pos + q(2)*k2; P = 0.5*(P1+P2); fprintf('projected point %d P = [ %g %g %g ]\n',k,P); fprintf('|P2-P1| = %g\n',norm(P2-P1)); fprintf('error = %g\n\n',norm(P-pt(k,:))); end
projected point 1 P = [ 4 8 3 ] |P2-P1| = 2.03507e-015 error = 1.60119e-015 projected point 2 P = [ 4 6 2 ] |P2-P1| = 2.66454e-015 error = 1.66163e-015 projected point 3 P = [ 2 3 0.1 ] |P2-P1| = 4.44089e-015 error = 6.14603e-015 projected point 4 P = [ 1 2 4 ] |P2-P1| = 3.58036e-015 error = 2.51215e-015