已知位姿真值,求特征匹配误差(内外参坐标转换)(重投影误差)

  • 目录

一、三维空间刚体运动的描述方式 

1. 旋转矩阵和变换矩阵

2. 旋转向量和欧拉角

3. 四元数

二、针孔相机模型

内参 

 相机坐标系-->成像平面

成像平面-->像素坐标系

相机坐标系-->像素坐标系

外参

三、畸变模型

四、求特征匹配误差

已知

主要步骤

主要函数


一、三维空间刚体运动的描述方式 

1. 旋转矩阵和变换矩阵

        坐标系间的欧式变换: a' = Ra + t

        变换矩阵与齐次坐标:\begin{bmatrix} a'\\1 \end{bmatrix} = \begin{bmatrix}R &t\\0&1 \end{bmatrix}\begin{bmatrix}a\\1 \end{bmatrix}= T\begin{bmatrix}a\\1 \end{bmatrix}

        T=\begin{bmatrix}R &t\\0&1 \end{bmatrix},T^{-1}=\begin{bmatrix}R^T &-R^Tt\\0 &1 \end{bmatrix}

        相对位姿求解:

        ^2P=^2T_1\ ^1P

        ^2T_1=(^wT_2)^{-1}\ ^wT_1=\begin{bmatrix}R_2^TR_1 & R_2^Tt_1-R_2^Tt_2\\0&1 \end{bmatrix}

        缺点:R∈SO(3)使用九个量表示三个自由度的旋转,T∈SE(3)使用16个量表示六个自由度的变换,有冗余,不紧凑。

2. 旋转向量和欧拉角

        旋转表征:一个旋转轴+一个旋转角

        旋转向量:方向和旋转轴一致,长度等于旋转角

        外积可以表示旋转:考虑两个不平行的向量a,b,用右手的4个指头从a转向b,大拇指朝向就是旋转向量的方向,即a×b的方向,它的大小由a和b的夹角决定。

        a\times b=\begin{bmatrix}i&j&k\\a_1&a_2&a_3\\b_1&b_2&b_3 \end{bmatrix}=\begin{bmatrix}a_2 b_3-a_3b_2\\a_3b_1-a_1b_3\\a_1b_2-a_2b_1 \end{bmatrix}=\begin{bmatrix}0&-a_3&a_2\\a_3&0&-a_1\\-a_2&a_1&0 \end{bmatrix}b

        方向垂直于a,b,大小为|a||b|sin<a,b>

        欧拉角:使用三个分离的转角,将一次旋转分解为3次绕不同轴的旋转

        缺点:万向锁和奇异性

3. 四元数

二、针孔相机模型

相机坐标系下的现实空间点 :P=(X, Y,Z)^T

成像平面中的成像点: P'=(X',Y',Z')^T

像素平面o-u-v中像素坐标:(u,v)^T

内参 

 相机坐标系-->成像平面

\frac{Z}{f}=\frac{X}{X'}=\frac{Y}{Y'}\Rightarrow X'=\frac{f}{Z}X, \ Y'=\frac{f}{Z}Y

成像平面-->像素坐标系

相差一个缩放和一个原点的平移

\begin{cases}u=\alpha X'+c_x\\v=\beta Y'+c_y \end{cases}

相机坐标系-->像素坐标系

\begin{cases}u=\alpha f\frac{X}{Z}+c_x\\v=\beta f\frac{Y}{Z}+c_y \end{cases}\Rightarrow \begin{cases}u=f_x\frac{X}{Z}+c_x\\v=f_y\frac{Y}{Z}+c_y \end{cases}

        (其中f的单位是米,f_x, f_y单位是像素 )

写为矩阵形式,并使用齐次坐标

\begin{bmatrix} u\\v\\1\end{bmatrix}=\begin{bmatrix} f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix}\begin{bmatrix} \frac{X}{Z}\\ \\\frac{Y}{Z}\\\\ 1\end{bmatrix}\Rightarrow\begin{bmatrix}u\\v\\1 \end{bmatrix}=K\begin{bmatrix}x\\y\\1 \end{bmatrix}

        其中(u,v)是像素平面的二维坐标,(x,y)是归一化相机平面的坐标:将世界点投影到相机系后将其相机系下的深度置为1

外参

P_{1}=\begin{bmatrix} x&y&1\end{bmatrix}^T\tilde{P_{2}}=RP_{1}+tP_2=\frac{\tilde{P_2}}{\tilde{P_2}[2]}

\begin{bmatrix}u_2\\v_2\\1 \end{bmatrix}=KP_2

三、重投影误差的计算

根据公式(1)

\begin{bmatrix}u\\v\\1 \end{bmatrix}=K\begin{bmatrix}x\\y\\1 \end{bmatrix}          (1)

已知像素坐标(u,v)和相机内参的情况下,可以求得三维空间点在相机归一化平面上的坐标(x,y)

假设三维点深度是s(也就是Z),三维点真正的空间坐标是

P=s\begin{bmatrix}x\\y\\1 \end{bmatrix}

根据相对位姿将其变换到另一相机坐标系下

P'=Rs\begin{bmatrix}x\\y\\1 \end{bmatrix}+t

其在相机2的归一化平面上坐标为

P_{norm}=\begin{bmatrix} f(R,t,s,x)\\f(R,t,s,y)\\1\end{bmatrix}

再根据公式1,可得到重投影坐标

由于P_{norm}中s并不能消掉,因此计算重投影误差必须知道特征对应三维空间点在相机1下的深度。

四、畸变模型

五、求特征匹配误差

已知

两幅图像img0,img1

两幅图像分别的位姿真值:[tx1,ty1,tz1,qx1,qy1,qz1,qw1],[tx2,ty2,tz2,qx2,qy2,qz2,qw2]

两幅图像匹配的特征点mkpts0,mkpts1

相机内参K

相机畸变参数D

主要步骤

将img0上的像素特征点转换到img1像素坐标中

1. 根据两幅图像在世界坐标系下的位姿,求出其相对位姿

         T=\begin{bmatrix}R &t\\0&1 \end{bmatrix},T^{-1}=\begin{bmatrix}R^T &-R^Tt\\0 &1 \end{bmatrix}       

        相对位姿求解:   

             ^2P=^2T_1\ ^1P     

           ^2T_1=(^wT_2)^{-1}\ ^wT_1=\begin{bmatrix}R_2^TR_1 & R_2^Tt_1-R_2^Tt_2\\0&1 \end{bmatrix}

2. 求出mkpts0像素坐标对应的相机1归一化平面的坐标

3. 根据深度信息求出mkpts0对应的三维空间点

4. 利用相对位姿映射到相机2坐标系中

5. 得到相机2归一化平面的坐标

6. 得到相机2像素平面的重投影坐标

相关函数

  • 将四元数转换为旋转矩阵
from scipy.spatial.transform import Rotation as R
def quaternin2rot(q)
    r = R.from_quat(q)
    rot = r.as_matrix()
    return rot
  • 求矩阵乘法
c = a @ b
  •  求矩阵的逆
import numpy as np
a_inverse = np.linalg.inv(a)
  • 将二维非齐次坐标p转换为齐次坐标 
p = np.array([p[0], p[1], 1.0])
  • 保存数据到指定txt文件
def save_to_file(errors, filename)
    with open(filename, 'w') as f:
        for error in errors:
            f.write(f"{error:.6f} \n")

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值