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

世界坐标、相机坐标、图像坐标、像素坐标的原理、关系,并用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 仿真:

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 仿真:

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仿真:

function [Pixel_Matrix] = pixel(dx,dy,u0,v0)
%图像坐标离散化,转化为像素坐标
%输入参数:
%   dx      x轴方向上分辨率,像素大小
%   dy      y轴方向上分辨率,像素大小
%   (u0,v0) 参考坐标,图像平面中心
if nargin==2u0 = 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 主程序

% 将世界坐标转化为像素坐标的参数
%% 程序
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 仿真

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; 

仿真结果:

 

注:

  • 程序中好多参数是本人找的,有的参数,我简单化了。也可以改参数运行。
  • 本文参考了:https://download.csdn.net/download/chentravelling/9833120
  • 本博客文档下载地址:https://download.csdn.net/download/weixin_41649786/10629546
  • 本博客代码下载地址:https://download.csdn.net/download/weixin_41649786/10629733

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 三维高程根据图片颜色给对应点赋予颜色

目录 1. 问题分析 2. 技术分析 3. 程序代码 4. 代码运行结果 1. 问题分析 日常工作尤其是测绘、地质、遥感行业,需要画DEM模型,并在这个模型的基础上,进行着色、渲染。比如,地质分析地面三维地表形变之时,需要根据D…

DirectX11中XNA数据库常见的几个函数

本博客的例子来自于《基于DirectX11的3D图形程序设计案例教程》 矩阵转换函数XMStoreFloat*x*(*表示正数,**矩阵) 如:XMStoreFloat4x4(以44矩阵为例) 函数定义: VOID XMStoreFloat4x4([out]…

电磁波谱详细划分

电磁波波段名字 波长范围(单位/m) 频率范围(单位/Hz) γ射线 <10-12 X射线 10-11~10-8 紫外线 10-8~3.8-7 可见光 (8.310-7~7.610-7m) 紫 3.810-7~4.310-7 蓝 4.310-7~4.710-7 青 4.710-7~5.010-7 绿 5.010-7~5.610-7 黄 5.610-7~5…

matlab 计算N天前(后)的日期

注意时间的格式&#xff1a;是字符串、数字还是日期&#xff1f; 下面是计算明天、今天、昨天的日期。 day1 datetime(datestr(now,yyyy-mm-dd))caldays(1)%tomorrowday0 datetime(datestr(now,yyyy-mm-dd))%todayday_1 datetime(datestr(now,yyyy-mm-dd))-caldays(1)%yest…

CAT arguments dimensions are not consistent.CAT参数的维度不一致。

错误实例&#xff1a; 在写符号矩阵的时候常常会出现下面错误&#xff1a; 错误&#xff1a;CAT arguments dimensions are not consistent. CAT参数的维度不一致。 举个栗子&#xff1a; clear; close all; clc; syms A_0 B_0 B C D E F G H ;T_3 [2*A_0 C-D*1i H G*1i;C…

传感器尺寸、像素、DPI分辨率、英寸、毫米的关系

虽然网上有很多这种资料&#xff0c;但是太过于复杂&#xff0c;每个人的说法都不一样&#xff0c;看的让人云里雾里的&#xff0c;我总结了一下&#xff0c;不知道对不对&#xff01; 1. 1英寸25.4mm 2. 传感器尺寸&#xff1a;传感器的尺寸是指传感器的大小&#xff0c;一般…

利用PS将n张图制作成动态GIF图

第一步&#xff1a;打开PS,导入图片&#xff0c;文件→脚本→将文件载入堆栈… 数据量大的话&#xff0c;就耐心等待一下。 第二步&#xff1a; 创建祯动画 如果没有这个&#xff0c;可以点击窗口→时间轴 如果祯排列顺序反了&#xff0c;这样 最后按照自己要求设置祯动画时间&…

matlab padarray函数详解

本文来自于matlab帮助页面&#xff0c;命令&#xff1a;help padarray 语法&#xff1a; B padarray(A,padsize) B padarray(A,padsize,padval) B padarray(A,padsize,padval,direction) gpuarrayB padarray(gpuarrayA,___) 描述&#xff1a; B padarray(A,padsize…

matlab 三维画图函数错误提示:数据维度必须一致

用三维画图软件经常会出现下面错误 以mesh(x,y,z)为例&#xff1a; 主要原因是因为没有注意Z数据格式&#xff0c;Z必须是矩阵形式。而且Z矩阵的m*n必须与y,x相关&#xff0c; mesh(X,Y,Z) 使用 Z 确定的颜色绘制线框网格&#xff0c;因此其颜色与曲面高度成比例。如果 X 和 …

毕业论文格式修改方法

好久没更新博客&#xff0c;忙着毕业论文。刚答完辩时就想写一篇关于论文格式的博客&#xff0c;这样在修改论文的时候很轻巧很多&#xff0c;别人花一两天修改好&#xff0c;我只需要几个小时&#xff08;包括图片大小、页面调整、错别字修改&#xff09;。话不多说&#xff0…

利用matlab实现SAR 图像线性拉伸显示

SAR 图像是一幅灰度图像&#xff0c;由于极少数点&#xff08;金属、裸地、建筑&#xff09;的后向散射太强&#xff0c;而导致SAR图像强度图的值分布范围很广&#xff0c;而图像显示值的分布为[0,255]&#xff0c;因此&#xff0c;如果直接显示&#xff0c;将会导致图像颜色很…

批量下载哨兵(Sentinel)数据

由于网络的原因&#xff0c;现在下载哨兵数据很难&#xff0c;直接在国外网站上下载&#xff0c;需要科学上网。某宝上虽然也提供下载哨兵数据的服务&#xff0c;但是价格太贵了&#xff0c;因此在网上找了很久&#xff0c;发现了一个非常非常实用的工具Internet Download Mana…

carsim输出端口2的宽度无效_PIO CORE 解析 (2)

下图为一般配置的PIO CORE:具有输入&#xff0c;输出和中断信号引脚&#xff0c;通过Avalon-MM接口与系统交互。下图提供了支持双向口功能的实例图&#xff1a;PIO内核的Avalon-MM接口由单个Avalon-MM从端口组成。从端口能够进行基本的Avalon-MM读和写传输。AvalonMM从端口提供…

利用matlab提取中心线

先看看代码运行结果&#xff08;红色部分表示河流中心线&#xff0c;黑色表示河流两岸&#xff01;&#xff09;&#xff1a; 注&#xff1a; 1. 由于河流两岸的坐标不是等距采样&#xff0c;所以无法保证100%准确&#xff0c;只要按着要求处理河岸坐标数据Shape文件&#xff…

b类 蚂蚁金服_股权设计与合伙制,解析蚂蚁金服与华为的顶层结构

股权设计与合伙制商道君这篇文章讲一讲股权设计与合伙制。股权设计和合伙制两者都是企业的顶层设计&#xff0c;股权的设计和合伙人制度有不同之处&#xff0c;但核心点都只有一个那就是——争夺企业的控制权。举例&#xff1a;马云与阿里巴巴马云说&#xff0c;如果阿里巴巴不…

SARScape二次开发-IDL编程心得

最近由于项目需要&#xff0c;需要使用IDL编程。此前从接触过编程&#xff0c;但好在有matlab、C编程的一些底子&#xff0c;所以自学编程&#xff0c;进行SARScape二次开发。相比MATLAB而言&#xff0c;IDL资料少&#xff0c;而且只有英文版的官方帮助&#xff0c;学起来非常费…

地址池命令 思科理由_论CCNA基础之常用命令

Cisco常用查看命令&#xff1a;Show VLAN brief //查看端口所属VLANShow ip int brief //查看端口的启用状态特权模式下Show running-config //查看设备当前运行配置特权模式下Show clock //查看当前系统时钟特权模式下 show log //查看log 日志特权模式下show interface //查看…

SARscape 二次开发讲解

官方给了一些讲解(地址&#xff1a;SARscape/SARscape IDL Scripting/SARscape batch object)&#xff0c;以及一些参考例子&#xff08;地址&#xff1a;SARscape/SARscape IDL Scripting/Example&#xff09;都可以用来学习参考。 SARscape 二次开发可以分为10个详细的步骤&a…

applicationproperties不是小叶子_三角梅整株叶子发黄从这里找原因,早解决早生长!...

家里的花草长得好不好&#xff0c;看叶子就行&#xff0c;长势好的叶子翠绿&#xff0c;油亮有光泽&#xff0c;长势不好的叶子发黄&#xff0c;暗淡无生机。所以如果花草的叶子不健康&#xff0c;那么就是哪里出了问题&#xff0c;需要及时找出原因解决。为什么家里盆栽的三角…

利用Matlab替换图片部分颜色

目录 1. 需求分析 2. 技术分析 3. 程序代码 1. 需求分析 日常工作、研究、学习当中&#xff0c;往往需要对图片进行处理。其中图片重新着色、渲染是非常常见的。比如说去掉或则更换证件照底色&#xff1b;去掉遥感图像中黑边……为解决此类问题&#xff0c;而编写此代码。 …