您的位置:首页 > 编程语言 > MATLAB

世界坐标、相机坐标、图像坐标、像素坐标的原理、关系,并用matlab仿真

2018-08-27 17:34 1991 查看
版权声明:路漫漫其修远兮,吾将上下而求索 https://blog.csdn.net/weixin_41649786/article/details/82115829

世界坐标、相机坐标、图像坐标、像素坐标的原理、关系,并用matlab仿真

照相机是日常生活中最常见的。它能把三维的空间图片等比例缩小投影在照片上,称为一个二维图像。

以下我们就讲一讲原理,并相应的进行matlab仿真。

在学之前,先要了解几个概念:

  • 什么是世界坐标? 也就是真实世界的立体空间坐标,是一个三维坐标系
  • Ow-XwYwZw :世界坐标系,描述相机位置,单位m
  • 什么是相机坐标?
      根据透镜成像原理,将世界坐标在照相机内呈现,是一个三维坐标系
    • Oc-XcYcZc  :相机坐标系,光心为原点,单位m
  • 什么是图像坐标?
      将相机呈现的三维坐标投影到屏幕上,而建立的新坐标系,不含高程信息,是一个二维坐标系
    • o-xy :图像坐标系,原点为成像平面中点,单位mm
  • 什么是像素坐标?
      将投影的图像坐标离散抽样形成的做种图片,是一个二维的坐标系
    • uv :像素坐标系,原点为图像左上角,单位pixel

    所以步骤流程就是:

    • step1:将世界坐标转化为相机坐标,等比例缩小,外加旋转平移,称之为刚体变换;
    • step2:将相机坐标转化为图像坐标,称为投影
    • step3:将图像坐标离散抽样

    模型如下图所示:

    step1:构造rigbt()函数

           世界坐标转化为相机坐标模型如下图所示:

     

    从世界坐标系变换到相机坐标系属于刚体变换:即物体不会发生形变,只需要进行旋转和平移。

    R:表示旋转矩阵

    T:表示偏移向量

    接下来分析旋转和平移

           坐标轴绕z轴旋转 θ=Theta(希腊字母读法,编程用的到),其几何模型如下图所示:

     

     公式满足:

     矩阵形式为:

    同理,绕x、y轴可以写成:

    所以刚体变化中旋转变换R=R1R2R3。

    平移矩阵T,则刚体变换可以写成:

    进一步转化,可以写成4阶矩阵:

    R矩阵是一个3×3矩阵,T是一个3×1矩阵,RT是一个4×4矩阵。

    matlab 仿真:

    [code]function [RT] = rigbt(Phi, Psi, Theta, x0, y0, z0)
    %刚体变换函数:rigid body transformation
    %输入参数:
    %   φ=Phi       绕x轴转动的角度
    %   ψ=Psi       绕y轴转动的角度
    %   θ=Theta     绕z轴转动的角度
    %输出参数:
    %    RT 将坐标轴进行刚体变化(旋转+平移)成新的坐标轴
    %
    %% 程序
    R1 = [1 0 0; 0 cos(Phi) sin(Phi); 0 -sin(Phi) cos(Phi)];%绕X轴旋转
    R2 = [cos(Psi) 0 -sin(Psi); 0 1 0; sin(Psi) 0 cos(Psi)];%绕Y轴旋转
    R3 = [cos(Theta) sin(Theta) 0;-sin(Theta) cos(Theta) 0; 0 0 1 ];%绕Z轴旋转
    R = R3 * R1 * R2;%旋转矩阵(刚体变换一部分)
    T = [x0; y0; z0];%平移矩阵
    RT=[R T;0 0 0 1];%刚体变换矩阵
    return

    step2:构造proj()函数

    相机坐标投影成图像坐标,几何模型如下图所示:

    几何关系(相似)满足:

     

    即:

     

    代入:

    写成矩阵形式:

    matlab 仿真:

    [code]function [Projection_Matrix] = proj(f)
    %相机坐标投影(projection)成图像坐标
    %输入参数
    %   f                   相机焦距(数,cm)
    %输出参数
    %   Projection_Matrix   投影成像(矩阵)
    Projection_Matrix = [f 0 0 0; 0 f 0 0; 0 0 1 0];
    return

     

    step3:构造pixel()函数

     xoy是图像坐标; uo_{uv}v是像素坐标; (u0,v0)是像素坐标的中心; p(x,y)是图像中的任意一点。

    模型如下:

     

    将x、y分成n份,每份长度为dx、dy。

    则几何公式为:

    转化为矩阵形式:

     

    matlab仿真:

    [code]function [Pixel_Matrix] = pixel(dx,dy,u0,v0)
    %图像坐标离散化,转化为像素坐标
    %输入参数:
    %   dx      x轴方向上分辨率,像素大小
    %   dy      y轴方向上分辨率,像素大小
    %   (u0,v0) 参考坐标,图像平面中心
    if nargin==2
    u0 = 0;
    v0 = 0;
    end
    Pixel_Matrix = [1/dx 0 u0; 0 1/dy v0; 0 0 1];
    return

    step4:前三步整合

    公式中, fx=f/dx,fy=f/dy。

    matlab 主程序

    [code]% 将世界坐标转化为像素坐标的参数
    %% 程序
    clear all;close all; clc;
    % 参数
    Phi = pi/4;%绕x轴旋转角度
    Psi = pi/4;%绕y轴旋转角度
    Theta = pi/4;%绕z轴旋转角度
    x0 = 0;%x平移量
    y0 = 0;%y平移量
    z0 = 0;%z平移量
    f = 35e-3;%35mm相机
    dx = 0.026;%一个像素的长
    dy = 0.026;%一个像素的宽
    u0 = 0;%图像平面中心
    v0 =0;%图像平面中心
    
    %% step1:将世界坐标转化为相机坐标,等比例缩小,外加旋转平移(刚体变换)
    RT = rigbt(Phi, Psi, Theta, x0, y0, z0);%刚体变换矩阵
    
    %% step2:将相机坐标转化为图像坐标(投影)
    Projection_Matrix = proj(f);%投影矩阵
    
    %% step3:将图像坐标离散抽样
    Pixel_Matrix = pixel(dx,dy,u0,v0);%1像素=0.635厘米÷24≈0.026458厘米
    %% 数据整合
    Camera_Internal_Parameters = Pixel_Matrix * Projection_Matrix;%相机内参数
    Camera_External_Parameters = RT;%相机外参数
    %清除不用的变量
    clearvars -except Camera_Internal_Parameters Camera_External_Parameters
    %相机参数
    Camera_Parameters = Camera_Internal_Parameters*Camera_External_Parameters
    clearvars -except Camera_Parameters%清除变量

    仿真结果:

    扩展:

    实际应用中,往往将上面的主程序main制作成一个相机参数函数camera_ parameters(),更有利于调用。可以用下面相机参数函数一个代替上面的main程序。

    matlab 仿真

    [code]function [Camera_Parameters] = camera_parameters()
    % 将世界坐标转化为像素坐标的参数(相机参数矩阵)
    % 参数,可以省,省去的话,必须设置相应的入参
    Phi = pi/4;%绕x轴旋转角度
    Psi = pi/4;%绕y轴旋转角度
    Theta = pi/4;%绕z轴旋转角度
    x0 = 0;%x平移量
    y0 = 0;%y平移量
    z0 = 0;%z平移量
    f = 35e-3;%35mm相机
    dx = 0.026;%一个像素的长
    dy = 0.026;%一个像素的宽
    u0 = 0;
    v0 =0;
    
    %% step1:将世界坐标转化为相机坐标,等比例缩小,外加旋转平移(刚体变换)
    RT = rigbt(Phi, Psi, Theta, x0, y0, z0);%刚体变换矩阵
    
    %% step2:将相机坐标转化为图像坐标(投影)
    Projection_Matrix = proj(f);%投影矩阵
    
    %% step3:将图像坐标离散抽样
    Pixel_Matrix = pixel(dx,dy,u0,v0);%1像素=0.635厘米÷24≈0.026458厘米
    %% 数据整合
    Camera_Internal_Parameters = Pixel_Matrix * Projection_Matrix;%相机内参数
    Camera_External_Parameters = RT;%相机外参数
    %相机参数
    Camera_Parameters = Camera_Internal_Parameters*Camera_External_Parameters;

    仿真结果:

     

    注:

     

                                                                                                                     给学matlab的人,包括我自己一个勉励:路漫漫其修遠兮,吾將上下而求索

    阅读更多
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐