相机投影变换(位姿)

相机投影变换(位姿).md
针对SLAM新手中常见的对各种变换的迷惑,我这里答疑一下。

针孔相机模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cPyc6VkK-1587194378847)(:/8acde09162b7499bb062e947abb2db78)]
image

其中:

  • M e x t M_{ext} Mext是等距变换,也就是欧式刚体变换
  • M p r o j M_{proj} Mproj是投影变换(摄影变换/透视变换),表达了空间中的一个正方形线框投影到平面上是什么形状。
  • M a f f M_{aff} Maff是一个仿射变换,但是实际上其本质我认为是一个相似变换+一个翻转形成的

参考
图像变换——等距变换,相似变换,仿射变换,投影变换
仿射变换与投影变换
摄像机模型

什么是相机位姿,投影矩阵,欧式变换矩阵

相机位姿T_{wc}:4*4矩阵,即能够将相机坐标系下3D点 P c P_c Pc变换为世界坐标系下点 P w P_w Pw,注意它不是投影矩阵,变换公式为:
P w = T w c × P c p w = R w c × p c t p w = t p c + t c w P_w=T_{wc}\times{P_c} \\ p_w=R_{wc}\times{p_c} \\ t^{pw}=t^{pc}+t^{cw} Pw=Twc×Pcpw=Rwc×pctpw=tpc+tcw

位姿的三种等价解释:

  • 一种是位姿指的是Twc,可以将相机坐标系下的点变换到世界坐标系下的点
  • 一种是位姿指的是相机坐标系的原点在世界坐标系下的3D坐标
  • 一种是把世界坐标系变换为相机坐标系这个过程对应的那个变换

注:ORBSLAM中的Tcw代表将一个点从世界坐标变换到相机坐标,这不是相机位姿,而是相机位姿的逆
注意分清楚对一个3D点的变换,以及对坐标系的变换,两者叙述刚好相反。

下面是论文中常见的使用表述

两个坐标系F1,F2之间的欧式变换:指的是将新的坐标系F2中的点变换为原来的旧的坐标系F1中点的坐标,标记为 T 12 T_{12} T12

坐标系F1到F2的欧式变换: 指的是将坐标系F1中的点变换到F2中的点

Sensor extrinsics wrt. the body frame: 指的是该外参将sensor坐标系下的3D点变换到Body坐标系下的3D点

T b a T^a_b Tba: 表示将b坐标系中的3D点变换到a坐标系中的3D点

投影矩阵

投影矩阵 : 一般的投影矩阵被广泛认为是相机内参乘以从世界坐标系变为相机坐标系的3*4矩阵,得到的一个3*4的矩阵,其可以把一个世界坐标系下的点直接变为像素坐标,(但是我下面论述的时候有可能会把世界坐标系变换为相机坐标系的3*4矩阵叫做投影矩阵,最终得到相机坐标系下的3D点坐标(非归一化相机坐标系),注意区分,这两种叫法都有,一般以第一种包含内参K的叫法为准)

投影矩阵公式:

p u v = K T × p w = P p r o j × p w p_{uv}=KT\times{p_w}=P_{proj}\times{p_w} \\ puv=KT×pw=Pproj×pw
展开为:

[ p p i x e l − x p p i x e l − y 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] × [ r 11 r 12 r 13 t 1 r 21 r 22 r 23 t 2 r 31 r 32 r 33 t 3 ] × [ P w x P w y P w z 1 ] = P p r o j × [ P w x P w y P w z 1 ] \begin{bmatrix} p_{pixel-x} \\ p_{pixel-y} \\ 1 \end{bmatrix} =\left[ \begin{array}{ccc} fx & 0 & cx \\ 0 & fy & cy \\ 0 & 0 & 1 \end{array} \right] \times{} \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_1 \\ r_{21} & r_{22} & r_{23} & t_2 \\ r_{31} & r_{32} & r_{33} & t_3 \\ \end{bmatrix} \times{} \begin{bmatrix} P_{wx} \\ P_{wy} \\ P_{wz} \\ 1 \end{bmatrix} =P_{proj}\times{} \begin{bmatrix} P_{wx} \\ P_{wy} \\ P_{wz} \\ 1 \end{bmatrix} ppixelxppixely1=fx000fy0cxcy1×r11r21r31r12r22r32r13r23r33t1t2t3×PwxPwyPwz1=Pproj×PwxPwyPwz1

顺着双目相机看的方向,左眼为左目,右眼为右目。
假设现在双目相机左右目已经校正过了,光心平行,现在以左目坐标系为世界坐标系,现有一世界坐标系下点
P = [ p w x , p w y , p w z ] T P=[p_{wx},p_{wy},p_{wz}]^T P=[pwx,pwy,pwz]T
(注意:令将点从左目坐标系变换到右目坐标系的平移矩阵t={-30,0,0},所以在左目坐标系下,右目坐标系相对于左目坐标系的基线baseline=30m,即右目在左目的X轴正方向30m处。)
则将该点P变换到右目像素坐标系的像素坐标,即右目坐标系的投影矩阵为:

[ p p i x e l − x p p i x e l − y 1 ] = [ f x 0 c x − b a s e l i n e ∗ f x 0 f y c y 0 0 0 1 0 ] × [ P w x P w y P w z 1 ] \begin{bmatrix} p_{pixel-x} \\ p_{pixel-y} \\ 1 \end{bmatrix} =\left[ \begin{array}{ccc} fx & 0 & cx & -baseline*fx\\ 0 & fy & cy & 0\\ 0 & 0 & 1 & 0 \end{array} \right] \times{} \begin{bmatrix} P_{wx} \\ P_{wy} \\ P_{wz} \\ 1 \end{bmatrix} ppixelxppixely1=fx000fy0cxcy1baselinefx00×PwxPwyPwz1

投影矩阵与相机位姿: 投影矩阵是3*4矩阵,指的是将世界坐标系中的3D点变为像素坐标系中的2D点,相机位子是将相机坐标系下的3D点变为世界坐标系下的3D点,有一点互逆的关系,但是投影矩阵比相机位姿多了一个内参矩阵K的值

世界坐标系下“3D坐标” 转 像素坐标系下“像素坐标”

投影公式为:
P u v = K T P w P_{uv}=KTP_{w} Puv=KTPw
其中:

  • P u v P_{uv} Puv是一个3维列向量,前两维为像素坐标u和v,是二维齐次坐标。
  • K K K矩阵为3*3矩阵,就是相机内参数矩阵
  • T T T矩阵为34矩阵,为从世界坐标投影到相机坐标系的投影矩阵,也是该相机此时刻的位姿,左边33维为相对于最初始相机位姿旋转矩阵,右边的3*1维为平移向量
  • P w P_{w} Pw为场景点在世界坐标系下的3D位置,是4*1向量,前三个元素为X,Y,Z轴坐标,最后一个为1,是三维齐次坐标。
  • KT合起来叫做相机的投影矩阵,可以直接将世界坐标系变为像素坐标系

注,如果有畸变的话,那上述uv值为去畸变后的uv值,之后计算过程一致

展开为:
[ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] × [ 1 0 0 7 0 1 0 8 0 0 1 9 ] × [ X Y Z 1 ] % \begin{matrix} \left[ \begin{array}{c} u \\ v \\ 1 \end{array} \right]= \left[ \begin{array}{ccc} fx & 0 & cx \\ 0 & fy & cy \\ 0 & 0 & 1 \end{array} \right] \times{} \left[ \begin{array}{cccc} 1 & 0 & 0 & 7\\ 0 & 1 & 0 & 8\\ 0 & 0 & 1 & 9 \end{array} \right] \times{} \left[ \begin{array}{c} X \\ Y \\ Z \\ 1 \end{array} \right] % \end{matrix} uv1=fx000fy0cxcy1×100010001789×XYZ1

纯粹两个坐标系之间的单一变换

这里假设我们要把一个在相机坐标系中的3D点变换到世界坐标系中的3D点
P w = T w c × P c P_w=T_{wc}\times{}P_c Pw=Twc×Pc
旋转矩阵变换为:
p w = R w c × p c p_w=R_{wc}\times{}p_c pw=Rwc×pc
平移向量变换为:从相机坐标系原点指向世界坐标系原点。

其中:

  • P c P_c Pc为相机坐标系下3D空间点坐标
  • T w c T_{wc} Twc为位姿变换矩阵,指的是从相机坐标系到世界坐标系之间的变换,也就是相机位姿。注意其3*4部分仍然不是投影矩阵!!!
  • P w P_w Pw为世界坐标系下3D空间点坐标

展开为:

( P w x P w y P w z 1 ) = ( r 11 r 12 r 13 t 1 r 21 r 22 r 23 t 2 r 31 r 32 r 33 t 3 0 0 0 1 ) × ( P c x P c y P c z 1 ) \begin{pmatrix} P_{wx} \\ P_{wy} \\ P_{wz} \\ 1 \end{pmatrix} =\begin{pmatrix} r_{11} & r_{12} & r_{13} & t_1 \\ r_{21} & r_{22} & r_{23} & t_2 \\ r_{31} & r_{32} & r_{33} & t_3 \\ 0& 0 & 0 & 1 \end{pmatrix} \times{} \begin{pmatrix} P_{cx} \\ P_{cy} \\ P_{cz} \\ 1 \end{pmatrix} PwxPwyPwz1=r11r21r310r12r22r320r13r23r330t1t2t31×PcxPcyPcz1

约定: T w c 代 表 一 个 能 将 3 D 点 从 相 机 坐 标 系 转 换 为 世 界 坐 标 系 下 的 3 D 点 , 这 样 的 一 个 的 变 换 矩 阵 T_{wc}代表一个能将3D点从相机坐标系转换为世界坐标系下的3D点,这样的一个的变换矩阵 Twc3D3D

多重位姿变换

现在有:

  • 世界坐标系下点 P w = ( P w x , P w y , P w z , 1 ) P_{w}=(P_{wx},P_{wy},P_{wz},1) Pw=(Pwx,Pwy,Pwz,1)
  • 相机坐标系F1对应的相机位姿 T 1 T_1 T1,以及F1下 P w P_{w} Pw对应的相机坐标系坐标 P c 1 P_{c1} Pc1
  • 相机坐标系F2对应的相机位姿 T 2 T_2 T2,以及F1下 P w P_{w} Pw对应的相机坐标系坐标 P c 2 P_{c2} Pc2
  • 坐标系F1到F2之间的欧式变换 T 12 T_{12} T12,即将心坐标系F2中的点变换到F1中的点,
    满足:
    P w = T 1 ∗ P c 1 P c 1 = T 12 ∗ P c 2 得 到 : P w = T 12 ∗ T 1 ∗ P c 2 P_{w}=T_1*P_{c1} \\ P_{c1}=T_{12}*P_{c2} \\ \quad得到: \\ P_{w}=T_{12}*T_1*P_{c2} Pw=T1Pc1Pc1=T12Pc2:Pw=T12T1Pc2

相机位姿就是当前相机坐标系和世界坐标系之间的欧式变换矩阵,这个矩阵将点从当前相机坐标系变换为世界坐标系中的点

初始相机位姿为4*4单位矩阵,代表世界坐标系经过单位矩阵变换仍然是同一个变换矩阵,其中世界坐标系与初始的相机朝向有一个固定关系,比如一般定义为Z轴正方向为相机看的方向。从而建立相机看的方向与欧式变换矩阵真正的关联

相机坐标系下“相机坐标” 转 像素坐标系下“像素坐标”

坐标转换公式为:
Z × P u v = K × P c 即 Z P u v = K P c Z\times{}P_{uv}=K\times{}P_{c} \\ 即 ZP_{uv}=KP_{c} Z×Puv=K×PcZPuv=KPc
其中:

  • P u v P_{uv} Puv为一个三维列向量,前两维为像素坐标u和v,是二维齐次坐标
  • Z为相机坐标系下3D点的Z坐标
  • K矩阵为3*3相机内参矩阵
  • P c P_{c} Pc为相机坐标系下的3D坐标

展开为:

Z ( u v 1 ) = ( f x 0 c x 0 f y c y 0 0 1 ) × ( X Y Z ) Z\begin{pmatrix} u \\ v \\ 1 \end{pmatrix} =\begin{pmatrix} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{pmatrix} \times{} \begin{pmatrix} X \\ Y \\ Z \end{pmatrix} Zuv1=fx000fy0cxcy1×XYZ

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: PnP算法(Perspective-n-Point算法)是一种在计算机视觉中用于估计相机位姿(即相机的位置和朝向)的方法。PnP算法的输入是已知的三维点和它们在图像上对应的二维点,输出是相机位姿变换。 以下是使用PnP算法计算位姿变换的一般步骤: 1. 收集三维点和它们在图像上对应的二维点。这些点可以通过多种方式获得,例如使用激光扫描仪或结构光扫描仪获取3D点云数据,或使用摄像机捕捉物体的图像来获取二维点。 2. 确定相机的内部参数,例如相机的焦距、主点和畸变系数。这些参数可以通过标定相机获得,标定方法包括张氏标定法和Tsai-Lenz标定法等。 3. 使用PnP算法,将三维点和它们在图像上对应的二维点作为输入,并使用相机的内部参数,计算相机位姿变换。PnP算法的原理是通过三个或更多点在图像中的位置和它们在空间中的位置来计算相机位姿。 4. 对于大多数PnP算法,需要知道至少4个三维点和它们在图像上对应的二维点。这些点需要满足一个特定的几何约束条件,例如共面或非共面等条件。根据使用的算法,可能需要进一步的处理或优化来提高位姿估计的精度。 5. 计算得到相机位姿变换矩阵。这个变换矩阵可以将相机坐标系下的点转换到世界坐标系下,或将世界坐标系下的点转换到相机坐标系下。 总的来说,使用PnP算法计算位姿变换需要收集3D点云和2D图像对应的点,确定相机的内部参数,并使用PnP算法计算相机位姿变换矩阵。这个变换矩阵可以用来将相机坐标系下的点转换到世界坐标系下,或将世界坐标系下的点转换到相机坐标系下。 ### 回答2: PnP算法(Perspective-n-Point)是一种计算相机位姿变换的算法,通常用于计算相机的位置和姿态。下面是使用PnP算法计算位姿变换的步骤: 1. 特征点提取:从图像中提取特征点,可以使用SIFT、SURF、ORB等算法进行特征点检测和描述。 2. 特征匹配:将待定特征点与模型特征点进行匹配,可以使用最近邻算法或RANSAC算法来筛选匹配点对。 3. 求解位姿:选择足够数量的匹配点对,根据匹配点对的2D-3D关系进行PnP求解。可以使用EPnP、UPnP或APnP等算法进行求解。 4. 姿态优化:使用非线性优化算法(例如Levenberg-Marquardt)对求得的初始位姿进行优化,以获得更准确的位姿估计结果。 5. 可选步骤:根据需要,还可以进行相机姿态的迭代改进,通过递归或优化方法获得更精确的位姿解。 PnP算法可以用于计算相机在世界坐标系中的位置和姿态,适用于许多计算机视觉任务,例如增强现实、姿态估计、机器人导航等。然而,PnP算法的有效性和准确性受到输入特征点的质量和匹配准确性的影响,因此在应用中需要对算法进行适当的调优和判断。 ### 回答3: PnP(Perspective-n-Point)算法是一种用于计算相机位姿变换的方法,适用于计算从相机坐标系到世界坐标系的变换。 首先,我们需要确定至少3个在世界坐标系中已知的点和它们对应的在图像坐标系中的投影点。这些点可以通过目标物体上的特征点或者标定板上的角点来获取。 接下来,需要选取一个合适的PnP解算方法,其中比较常用的方法有EPnP和UPnP。EPnP使用最小化重投影误差的方法来求解,并且已经有很多现成的实现。UPnP则通过将PnP问题转化为最小化多项式问题来求解。 然后,根据选定的解算方法,我们将已知的3D点和它们在图像中的投影坐标传入算法中。这些信息将作为输入参数来计算相机的旋转矩阵和平移向量。 最后,根据计算得到的旋转矩阵和平移向量,我们可以得到相机位姿变换关系。利用这个变换关系,我们可以将图像坐标系中的点转化为世界坐标系中的点,或者实现相机位姿估计等应用。 需要注意的是,由于PnP算法是一种非线性优化问题,所以可能存在多个解或者无解的情况。另外,为了提高PnP算法的鲁棒性,还可以采用RANSAC等方法来进一步剔除误匹配点,提高算法的精度和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值