- 目录
一、三维空间刚体运动的描述方式
1. 旋转矩阵和变换矩阵
坐标系间的欧式变换: a' = Ra + t
变换矩阵与齐次坐标:
相对位姿求解:
缺点:R∈SO(3)使用九个量表示三个自由度的旋转,T∈SE(3)使用16个量表示六个自由度的变换,有冗余,不紧凑。
2. 旋转向量和欧拉角
旋转表征:一个旋转轴+一个旋转角
旋转向量:方向和旋转轴一致,长度等于旋转角
外积可以表示旋转:考虑两个不平行的向量a,b,用右手的4个指头从a转向b,大拇指朝向就是旋转向量的方向,即a×b的方向,它的大小由a和b的夹角决定。
方向垂直于a,b,大小为|a||b|sin<a,b>
欧拉角:使用三个分离的转角,将一次旋转分解为3次绕不同轴的旋转
缺点:万向锁和奇异性
3. 四元数
二、针孔相机模型
相机坐标系下的现实空间点 :
成像平面中的成像点:
像素平面o-u-v中像素坐标:
内参
相机坐标系-->成像平面
成像平面-->像素坐标系
相差一个缩放和一个原点的平移
相机坐标系-->像素坐标系
(其中f的单位是米,单位是像素 )
写为矩阵形式,并使用齐次坐标
其中(u,v)是像素平面的二维坐标,(x,y)是归一化相机平面的坐标:将世界点投影到相机系后将其相机系下的深度置为1
外参
,,
三、重投影误差的计算
根据公式(1)
(1)
已知像素坐标(u,v)和相机内参的情况下,可以求得三维空间点在相机归一化平面上的坐标(x,y)
假设三维点深度是s(也就是Z),三维点真正的空间坐标是
根据相对位姿将其变换到另一相机坐标系下
其在相机2的归一化平面上坐标为
再根据公式1,可得到重投影坐标
由于中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. 根据两幅图像在世界坐标系下的位姿,求出其相对位姿
相对位姿求解:
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")