在使用carla过程中有获取其相机内外参和从相机外参中获取translation、rotation并完成旋转矩阵转四元数的需求,记录一下过程。
先上代码说明如何从相机外参中获取translation、rotation并完成旋转矩阵转四元数:
import numpy as np
from scipy.spatial.transform import Rotation as R
############ 4*4的相机外参矩阵 ##########
a=np.mat([[-6.81184744e-03 ,-9.99976814e-01,2.62450999e-06,1.09513466e+02],
[ 9.99976695e-01,-6.81184791e-03,-5.41681657e-04,5.17240524e+01],
[ 5.41686954e-04,-1.06540392e-06,9.99999881e-01,2.40255165e+00],
[ 0.00000000e+00,0.00000000e+00,0.00000000e+00,1.00000000e+00]])
############ 分离出translation和rotation ##########
a3=a[[0,1,2]]
a33=a3[:,[0,1,2]]
a34=[a[0,3],a[1,3],a[2,3]]
a33=list
print(a33) #rotation
print(a34) #translation
############ 旋转矩阵rotation转四元数 ##########
r = R.from_matrix(a33)
qua = r.as_quat()
print(qua)
知识拓展:什么是相机内外参?
想理解内外参数,得先介绍几个坐标系,为什么是几个坐标系呢?以拍照为例,一个简单的拍照其实省略了很多坐标变换关系。为了方便研究,前人定义了世界坐标系,相机坐标系,图像坐标系,像素坐标系来剥离这些变换关系。
- 世界坐标系:xyz笛卡尔坐标系,“世界”顾名思义这个坐标系全局唯一,一切三维物体都以它作为坐标系。
- 相机坐标系:xyz笛卡尔坐标系,在世界坐标系下建立的,相当于抽象化的针孔相机模型,以主轴为Z轴,小孔所在平面为xoy面,全局不唯一,几台相机就有几个相机坐标系。
- 图像坐标系:xy笛卡尔坐标系,在相机坐标系下建立的,以主点为原点,在成像平面上定义的坐标系。主点是指针孔相机主轴与成像平面的交点。
- 像素坐标系:xy笛卡尔坐标系,与图像坐标系重合但原点不同,该坐标系原点通常位于左上角,之前的坐标系都以物理尺寸做为单位,而像素坐标系以像素为单位,它上面的点等同于图像上的像素。
外参数([R|t])描述世界坐标系与相机坐标系的变换关系,参数包括:旋转R,平移T。
内参数(K)描述相机坐标系,图像坐标系,像素坐标系之间的变换关系,参数包括主点坐标,焦距,单位像素宽与高。
稍微详细一点来说:
关于相机内外参的知识还有很多,以上也基本都是从其他地方转载抄录过来的,更多知识可以点击以下几个链接学习:
一文带你搞懂相机内参外参(Intrinsics & Extrinsics)