【数字图像处理】3D到2D的投影(Octave/Matlab)

从现实世界到图像的投影坐标系:面试

(x, y, z)→(x', y', -d),注意这个示意图中不包含左右,上下的翻转变化。app

根据类似三角形理论能够算出:(x, y, z)→(-dx/z, -dy/z, -d), 因为z是变量,因此这并非一个线性变换。加入一个齐次项,在齐次坐标系下,咱们能够经过矩阵的线性操做完成投影。函数

代码以下:(刚开始运行的时候,总是报calling error,但是网上没太多教程,我随便把变量赋值放在函数定义前面试了试,居然成功了==)spa

% Project a point from 3D to 2D using a matrix operation

%% Given: Point p in 3-space [x y z], and focal length f
%% Return: Location of projected point on 2D image plane [u v]


%% Test: Given point and focal length (units: mm)
p = [200 100 120];
f = 50;

function p_img = project_point(p, f)
    %% TODO: Define and apply projection matrix
    A = [f 0 0 0;
         0 f 0 0;
         0 0 1 0];
    p_hom = [p 1]';
    p_proj = A * p_hom;
    %disp(p_proj(2)/p_proj(3));
    p_img = [(p_proj(1)/p_proj(3)),(p_proj(2)/p_proj(3))];
endfunction

%% Test: Given point and focal length (units: mm)
p = [200 100 100];
f = 50;

pimg = project_point(p, f);
disp(pimg);