matlab相机标定工具(camera calibrator)内外参矩阵数据格式

摘要

matlab把点坐标看作行向量,而《视觉SLAM十四讲》(以下简称《十四讲》)把点坐标看作列向量,因此它们把世界坐标系下的点投影到像素坐标系下时,使用的公式有所不同。这导致使用matlab标定得到相机的内外参矩阵,与高翔《视觉SLAM十四讲》所说的内外参矩阵格式不一致。要想得到正确的参数,还需要弄清楚matlab内外参矩阵的数据格式。


结论

先给出结论,简单来说以标定板左上角作为世界坐标系原点,uv方向作为世界坐标系的XY轴,有一下结论:

  • matlab标定得到的相机内参矩阵(IntrinsicMatrix, K m a t l a b K_{matlab} Kmatlab),对应的是《十四讲》中的 K T K^T KT
  • matlab标定得到的旋转矩阵(RotationMatrices , R m a t l a b R_{matlab} Rmatlab),对应的是《十四讲》中的 R w c ( 3 × 3 ) R_{wc(3\times 3)} Rwc(3×3)
  • matlab标定得到的平移向量(TranslationVectors, t m a t l a b t_{matlab} tmatlab),对应的是《十四讲》中的 t c w ( 1 × 3 ) T t_{cw(1\times 3)}^T tcw(1×3)T

内容

约定: 以标定板左上角作为世界坐标系原点,uv方向作为世界坐标系的XY轴。下标 c c c 表示camera(相机)坐标系, 下标 w w w 表示world(世界)坐标系,例如: T c w ( 3 × 4 ) T_{cw(3\times 4)} Tcw(3×4) 表示在这个矩阵右边乘以world世界坐标系下的点,会得到camera相机坐标系下的点。

《十四讲》:《十四讲》里把点坐标看作列向量,其将世界坐标系下的点 [ X Y Z 1 ] \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} XYZ1,投影到像素坐标系下的点 [ u v 1 ] \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} uv1的公式如下 :
s [ u v 1 ] = K T c w ( 3 × 4 ) [ X Y Z 1 ] = K [ R c w ( 3 × 3 ) t c w ( 3 × 1 ) ] [ X Y Z 1 ] \begin{aligned} s\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} &=KT_{cw(3\times 4)}\begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} =K\begin{bmatrix} R_{cw(3\times 3)} & t_{cw(3\times 1)} \end{bmatrix}\begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} \end{aligned} suv1=KTcw(3×4)XYZ1=K[Rcw(3×3)tcw(3×1)]XYZ1

matlab: matlab把点坐标看作行向量,其将世界坐标系下的点 [ X Y Z 1 ] \begin{bmatrix} X & Y & Z & 1 \end{bmatrix} [XYZ1],投影到像素坐标系下的点 [ u v 1 ] \begin{bmatrix} u & v & 1 \end{bmatrix} [uv1]的公式如下 :
s [ u v 1 ] = [ X Y Z 1 ] T c w ( 4 × 3 ) T K T = [ X Y Z 1 ] [ R c w ( 3 × 3 ) T t c w ( 1 × 3 ) T ] K T = [ X Y Z 1 ] [ R w c ( 3 × 3 ) t c w ( 1 × 3 ) T ] K T \begin{aligned} s\begin{bmatrix} u & v & 1 \end{bmatrix} &= \begin{bmatrix} X & Y & Z & 1 \end{bmatrix}T_{cw(4\times 3)}^T K^T \\ &= \begin{bmatrix} X & Y & Z & 1 \end{bmatrix}\begin{bmatrix} R_{cw(3\times 3)}^T \\ t_{cw(1\times 3)}^T \end{bmatrix}K^T \\ &= \begin{bmatrix} X & Y & Z & 1 \end{bmatrix}\begin{bmatrix} R_{wc(3\times 3)} \\ t_{cw(1\times 3)}^T \end{bmatrix}K^T \end{aligned} s[uv1]=[XYZ1]Tcw(4×3)TKT=[XYZ1][Rcw(3×3)Ttcw(1×3)T]KT=[XYZ1][Rwc(3×3)tcw(1×3)T]KT

Note: 旋转矩阵R为正交矩阵,而对于正交矩阵有该性质: R R T = R R − 1 = E RR^T=RR^{-1}=E RRT=RR1=E,即旋转矩阵的转置就是它的逆矩阵 R T = R − 1 R^T=R^{-1} RT=R1

综上可知,以标定板左上角作为世界坐标系原点,uv方向作为世界坐标系的XY轴,有一下结论,有如下结论成立:

  • matlab标定得到的相机内参矩阵(IntrinsicMatrix, K m a t l a b K_{matlab} Kmatlab),对应的是《十四讲》中的 K T K^T KT
  • matlab标定得到的旋转矩阵(RotationMatrices , R m a t l a b R_{matlab} Rmatlab),对应的是《十四讲》中的 R w c ( 3 × 3 ) R_{wc(3\times 3)} Rwc(3×3)
  • matlab标定得到的平移向量(TranslationVectors, t m a t l a b t_{matlab} tmatlab),对应的是《十四讲》中的 t c w ( 1 × 3 ) T t_{cw(1\times 3)}^T tcw(1×3)T

相关/参考链接

matlab帮助:cameraParameters

您好!对于开源的相机标定工具,我推荐使用OpenCV库中的相机标定工具。OpenCV是一个流行的计算机视觉库,提供了许多图像处理和计算机视觉功能,包括相机标定。 您可以使用OpenCV中的`calibrateCamera`函数来进行相机标定。这个函数可以根据一系列已知的物体点和对应的图像点来计算相机的内矩阵和畸变系数。 下面是一个简单的示例代码,展示了如何使用OpenCV进行相机标定: ```python import cv2 import numpy as np # 读取标定板上的角点坐标 objpoints = [] # 3D物体点 imgpoints = [] # 2D图像点 # 假设标定板上每个方格的大小为20mm square_size = 20 # 创建标定板角点的3D坐标 objp = np.zeros((6*8, 3), np.float32) objp[:, :2] = np.mgrid[0:8, 0:6].T.reshape(-1, 2) * square_size # 读取图像 images = glob.glob('calibration_images/*.jpg') for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 查找角点 ret, corners = cv2.findChessboardCorners(gray, (8, 6), None) if ret == True: objpoints.append(objp) imgpoints.append(corners) # 进行相机标定 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) # 打印结果 print("相机内矩阵:") print(mtx) print("畸变系数:") print(dist) ``` 上述代码假设您的标定板上有8x6个方格,每个方格大小为20mm。您需要将标定板的图像放在`calibration_images`文件夹下,并将文件夹路径修改为您的实际路径。 这只是一个简单的示例,您可以根据您的需求进行调整和扩展。希望对您有帮助!如果您有其他问题,请随时提问。
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值