相机光心在世界坐标系下的坐标(相机坐标系原点在世界坐标系下的坐标与c2w的关系)

例子

如下图所示,右边的坐标系是相机坐标系,左边的是世界坐标系。
假设他们只有 x 轴方向上的平移。
相机坐标系原点在相机坐标系下的坐标是 (0,0,0),
假设相机坐标系在世界坐标系沿 x 轴正方向 5 m 外,
则在世界坐标系下,相机坐标系原点的坐标为 (5,0,0)
也就是说针对任意一点 P,它在相机坐标系下的坐标为 (x_c,y_c,z_c)
那么它在世界坐标系下的坐标为 (x_c+5,y_c,z_c)
此时 c2w(camera to world) 矩阵右上角的 平移向量 为 (5,0,0)
也就是说 平移向量跟相机坐标系原点在世界坐标系下的坐标是一样的
在这里插入图片描述

如何取得相机坐标系原点在世界坐标系下的坐标

原理

定义坐标系1、坐标系2,那么向量 a \mathbf{a} a 在两个坐标系下的坐标为 a 1 \mathbf{a}_1 a1, a 2 \mathbf{a}_2 a2,它们之间的关系应该是
a 1 = R 12 a 2 + t 12 \mathbf{a}_1 = \mathbf{R}_{12}\mathbf{a}_2+\mathbf{t}_{12} a1=R12a2+t12
这里的
R 12 \mathbf{R}_{12} R12
是指“把坐标系2的向量变换到坐标系1”中。由于向量乘在这个矩阵的右边,它的下标是从右读到左的。同理,如果我们要表达“从1到2的旋转矩阵”时,就写成
R 21 \mathbf{R}_{21} R21
关于平移
t 12 \mathbf{t}_{12} t12
它实际对应的是坐标系1原点指向坐标系2原点的向量,在坐标系1下取的坐标,所以建议读成“从1到2的向量”。
相反地,
t 21 \mathbf{t}_{21} t21
即从2指向1的向量在坐标系2下的坐标,却并不等于 − t 12 -\mathbf{t}_{12} t12,而是和两个坐标系的旋转还有关系。
所以,当初学者问“我的坐标在哪里”这样的问题时,我们需要清楚地说明这句话的含义。这里“我的坐标”实际上指的是从世界坐标系指向自己坐标系原点的向量,在世界坐标系下取到的坐标。对应到数学符号上,应该是
t W C \mathbf{t}_{WC} tWC 的取值。
同理,它并不等于
− t C W -\mathbf{t}_{CW} tCW

代码

ray_o = c2w[:3, 3] 

相机原点(光心)在世界坐标系下取到的坐标用上述代码获取。
首先 c 2 w c2w c2w 是 相机到 世界坐标系的变换矩阵,对应平移向量可以写成
t W C \mathbf{t}_{WC} tWC
注意
W ← C W\leftarrow C WC
自右向左

为什么

至于为什么是这样,举个例子就很清楚,因为是坐标系的变换,所以刚好和坐标的变换有点相反过来的味道。

参考

《视觉SLAM14讲》第二版,电子工业出版社,p45-p46

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在标定相机之后,我们可以得到相机的内参矩阵和外参矩阵。其中,相机的外参矩阵包含了相机的旋转矩阵和平移向量,可以用来将相机坐标系下的点转换到世界坐标系下。 假设我们已经得到了相机的外参矩阵 R 和 t,以及相机拍摄的图像中一个点的像素坐标 u 和 v,并且已经知道了相机的内参矩阵 K,那么我们可以将该点从像素坐标系转换到相机坐标系世界坐标系。 首先,将像素坐标系下的点 (u, v, 1) 转换为相机坐标系下的点 P_c: ``` P_c = inv(K) * [u, v, 1]' ``` 其中,inv(K) 表示内参矩阵的逆矩阵,[u, v, 1]' 表示一个列向量。 接下来,将相机坐标系下的点 P_c 转换为世界坐标系下的点 P_w: ``` P_w = R * P_c + t ``` 其中,R 表示相机的旋转矩阵,t 表示相机的平移向量。 最终,我们可以计算出相机世界坐标系下的角度: ``` theta = atan2(R(2,1), R(1,1)) phi = atan2(-R(3,1), sqrt(R(3,2)^2 + R(3,3)^2)) psi = atan2(R(3,2), R(3,3)) ``` 其中,theta、phi、psi 分别表示相机绕 x、y、z 轴旋转的角度。注意,这里的 atan2 函数可以自动判断角度所属的象限。 完整代码示例: ```c++ cv::Mat K; // 内参矩阵 cv::Mat R, t; // 外参矩阵 cv::Point2f uv; // 像素坐标 // 将像素坐标系下的点转换为相机坐标系下的点 cv::Mat Pc = K.inv() * cv::Mat([uv.x, uv.y, 1]).t(); // 将相机坐标系下的点转换为世界坐标系下的点 cv::Mat Pw = R * Pc + t; // 计算相机世界坐标系下的角度 double theta = atan2(R.at<double>(1, 0), R.at<double>(0, 0)); double phi = atan2(-R.at<double>(2, 0), sqrt(pow(R.at<double>(2, 1), 2) + pow(R.at<double>(2, 2), 2))); double psi = atan2(R.at<double>(2, 1), R.at<double>(2, 2)); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

培之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值