处理点云数据(五):坐标系的转换

news/2024/6/17 7:59:27 标签: 3d, KITTI, matlab, 相机, 坐标系转换

相机的内外参矩阵

坐标系

主要有两类坐标系,一类为相机坐标系,一类为世界坐标系(即物体所处真实世界)
1

内参矩阵

设空间中有一点P,若世界坐标系与相机坐标系重合,则该点在空间中的坐标为(X, Y, Z),其中Z为该点到相机光心的垂直距离。设该点在像面上的像为点p,像素坐标为(x, y)。
2

由上图可知,这是一个简单的相似三角形关系,从而得到
3
但是,图像的像素坐标系原点在左上角,而上面公式假定原点在图像中心,为了处理这一偏移,设光心在图像上对应的像素坐标为(cx,cy),则
4
5

外参矩阵

以上情况是世界坐标系与相机坐标系重合的特殊情况,而在一般情况下,世界坐标系中的某一点P要投影到像面上时,先要将该点的坐标转换到相机坐标系下。设P在世界坐标系中的坐标为X,P到光心的垂直距离为s(即上文中的Z),在像面上的坐标为x,世界坐标系与相机坐标系之间的相对旋转为矩阵R(R是一个三行三列的旋转矩阵),相对位移为向量T(三行一列),则
6
其中[R T]是一个三行四列的矩阵,称为外参矩阵,它和相机的参数无关,只与相机在世界坐标系中的位置有关。

点云到相机的坐标转换

在第 i 个相机图像中,经过矫正的相机坐标3D点 X = ( x , y , z , 1 ) T X = (x, y, z, 1)^T X=(x,y,z,1)T 到点 Y = ( u , v , 1 ) T Y = (u, v, 1)^T Y=(u,v,1)T的投影表示为: Y = P r e c t ( i ) X Y = P_{rect}^{(i)}X Y=Prect(i)X
其中,
P r e c t ( i ) = ( f u ( i ) 0 c u i − f u ( i ) b x i 0 f v ( i ) c v i 0 0 0 1 0 ) P_{rect}^{(i)}= \begin{pmatrix} f_{u}^{(i)} & 0 &c_{u}^{i} & -f_{u}^{(i)}b_{x}^{i}\\ 0& f_{v}^{(i)} &c_{v}^{i} & 0\\ 0&0 &1 &0 \end{pmatrix} Prect(i)=fu(i)000fv(i)0cuicvi1fu(i)bxi00
为第i个相机的投影矩阵。$ b_{x}^{i} 表 示 相 对 于 参 考 相 机 0 的 基 线 ( 以 米 为 单 位 ) 。 为 了 在 参 考 相 机 坐 标 中 将 3 D 点 X 投 影 到 第 i 个 相 机 图 像 面 上 的 点 Y , 相 机 0 的 矫 正 旋 转 矩 阵 表示相对于参考相机0的基线(以米为单位)。为了在参考相机坐标中将3D点X投影到第i个相机图像面上的点Y,相机0的矫正旋转矩阵 0线)3DXiY0 R_{rect}^{(0)} $ 也必须考虑进去,所以:
Y = P r e c t ( i ) R r e c t ( 0 ) X Y = P_{rect}^{(i)} R_{rect}^{(0)}X Y=Prect(i)Rrect(0)X
在这里,$ R_{rect}^{(0)} $ 被扩展成了4*4的矩阵,令R(4, 4) = 1,其余为0。
1
最后再考虑点云到相机的外参矩阵,即 T v e l o c a m T_{velo}^{cam} Tvelocam
Y = P r e c t ( i ) R r e c t ( 0 ) T v e l o c a m X Y = P_{rect}^{(i)} R_{rect}^{(0)}T_{velo}^{cam}X Y=Prect(i)Rrect(0)TvelocamX
在上一节代码中:
内参矩阵?(应该是由相机的内参矩阵得到的,彩色摄像机和灰度摄像机有区别):calib.P_rect{cam+1}
基于相机0的旋转矩阵:R_cam_to_rect
外参矩阵:Tr_velo_to_cam

投影矩阵=内参矩阵 * 基于相机0的旋转矩阵 * 外参矩阵
P_velo_to_img = calib.P_rect{cam+1} * R_cam_to_rect * Tr_velo_to_cam

matlab">% 计算点云到图像平面的投影矩阵
R_cam_to_rect = eye(4);
R_cam_to_rect(1:3,1:3) = calib.R_rect{1};  % 参考相机0到相机xx图像平面的旋转矩阵
P_velo_to_img = calib.P_rect{cam+1}*R_cam_to_rect*Tr_velo_to_cam; % 内外参矩阵

点云坐标:p_in
点云到图像的投影矩阵:T

matlab">function p_out = project(p_in,T)
% p_in为点云坐标,T为点云到图像的投影矩阵

% 数据和投影矩阵的维数
dim_norm = size(T,1); % 3维
dim_proj = size(T,2); % 4维

% 在齐次坐标中进行转换
p2_in = p_in;
if size(p2_in,2)<dim_proj
  p2_in(:,dim_proj) = 1;
end
p2_out = (T*p2_in')';

% 归一化齐次坐标:
p_out = p2_out(:,1:dim_norm-1)./(p2_out(:,dim_norm)*ones(1,dim_norm-1));

相机的标定

相机的标定,即为通过某个已知的目标,求取相机内参矩阵的过程。最常用的标定目标就是棋盘格。用相机对棋盘格从不同角度拍摄多张照片,然后将这些照片导入标定程序或算法,即可自动求出相机的内参。
matlab中有自带的APP可以进行相机的标定:https://www.ilovematlab.cn/thread-267670-1-1.html
7

补充

点云的坐标系:X(前),Y(左),Z(上);
相机的坐标系:X(右),Y(下),Z(前);
即X—>Z(0,0,1),Y—>-X(-1,0,0),Z—>-Y(0,-1,0);
点云坐标系到相机坐标系的旋转矩阵应该为:
( 0 − 1 0 0 0 − 1 1 0 0 ) \begin{pmatrix} 0 &amp; -1 &amp;0 \\ 0 &amp; 0 &amp;-1 \\ 1&amp;0 &amp;0 \end{pmatrix} 001100010

MATLAB 四元数转R旋转矩阵的转换顺序为w,x,y,z;
坐标系2到坐标系1的T转换公式为: T 2 − &gt; 1 = T 1 − &gt; 0 − 1 ∗ T 2 − &gt; 0 T_{2-&gt;1} = T_{1-&gt;0}^{-1} * T_{2-&gt;0} T2>1=T1>01T2>0


http://www.niftyadmin.cn/n/1270560.html

相关文章

区块链100讲:Hyperledger Composer及其开发流程

2019独角兽企业重金招聘Python工程师标准>>> 本期区块链100讲&#xff0c;我们将了解Hyperledger Composer的组件&#xff0c;以及内部设计。然后通过一个示例看Composer如何将一个区块链应用抽象成若干概念并将这些概念体现在开发流程中。 1 Composer架构介绍 首先…

百度Apollo(一):代码模块

百度Apollo&#xff1a;https://github.com/ApolloAuto/apollo/tree/master/modules 一级目录结构重要文件夹内容&#xff1a; docker&#xff1a;docker有关的文件,如启动docker脚本,进入docker容器脚本。docs&#xff1a;文档模块&#xff0c;有完整英文文档和部分中文文档…

百度Apollo(二):障碍物感知模块

Apollo感知模块具有识别障碍物和交通灯的能力。 其中&#xff0c;Apollo解决的障碍物感知问题&#xff1a; 1. 高精地图ROI过滤器&#xff08;HDMap ROI Filter&#xff09; 2. 基于卷积神经网络分割&#xff08;CNN Segmentation&#xff09; 3. MinBox 障碍物边框构建&am…

Mac下安装Flutter,并创建第一个App

相关软件安装 JDK安装 下载前往下载页面下载安装包&#xff1a;http://www.oracle.com/technet... 下载8.x的版本&#xff0c;8以上的会出问题安装双击安装包&#xff0c;一路下一步至完成 配置找到jdk安装路径&#xff0c;一版情况为&#xff1a;/Library/Java/JavaVirtualMac…

处理点云数据(六):点云分割

展示了如何在三维激光雷达数据中检测地平面和发现附近的障碍物。 clear;clc; %% % for img_idx 181:446 % fid fopen(sprintf(D:/KITTI/data_set/2011_09_26/2011_09_26_drive_0009_sync/velodyne_points/data/%010d.bin,img_idx),rb); % velo fread(fid,[4 inf],s…

HDU 2089 不要62 (数位DP)题解

思路&#xff1a; 详解 数位DP入门题dp[pos][sta]&#xff0c;pos代表当前位数是第几位&#xff0c;sta代表当前状态&#xff0c;因为题目中只要不出现64&#xff0c;所以当前状态只分为两种&#xff1a;前一位是6或不是。 #include<iostream> #include<algorithm>…

基于点云的3D障碍物检测

基于点云的3D障碍物检测 主要有以下步骤&#xff1a; 点云数据的处理基于点云的障碍物分割障碍物边框构建点云到图像平面的投影 点云数据的处理 KITTI数据集 KITTI数据集有四个相机&#xff0c;主要使用第三个相机(序号为02)拍摄的图片、标定参数和标签文件。 点云数据一…

五、箭头函数

语法 javascript有基本的类函数&#xff0c;可以当做参数传递&#xff0c;最熟悉的setTimeout setTimeout(function() {console.log("setTimeout called!"); }, 1000);复制代码上面这种函数是没有名字的&#xff0c;我们称之为匿名函数 es6中规定了不同的语法去定义匿…