0

在 OpenCV 中,我使用的是 Charuco 板,已校准相机,并使用 SolvePnP 获取 rvec 和 tvec。(类似于示例代码)。我正在使用一个固定板,在围绕板旋转的圆形钻机上带有一个摄像头。我是一个菜鸟,所以如果这是我想念的简单的东西,请多多包涵。

我知道我可以使用 Rodrigues() 从 rvec 获取板方向的 3x3 旋转矩阵,并且我可以使用 -Rt() * tvec(在 c++ 中)将 tvec 值转换为世界坐标。

然而,据我所知,这个 3x3 旋转 R 给出了电路板相对于相机的方向,所以它不是很需要。我想要相机本身的旋转,它从 R 偏移(我认为)tvec 和相机空间中 z 轴之间的角度。(因为相机并不总是指向棋盘原点,而是总是指向相机空间中的 z 轴)。这个对吗?

如何找到额外的旋转偏移并将其转换为 3x3 旋转矩阵,我可以将其与 R 结合以获得实际的相机方向?

谢谢!

4

1 回答 1

1

假设您从相机中捕获了 Charuco 板的 N 帧。然后,您进行 N 次变换,将相机框架中的一个点转换为 Charuco 板框架中的同一点。这是从每一帧的 Charuco 板姿势中获得的。

假设我们将从一个坐标系到另一个坐标系的线性变换表示为

T 4x4 = [R 3x3 , t 3x1 ; 0 1x3 , 1]

如果我们从棋盘坐标系看一个点 P 并将其称为 P board。类似地,我们从称为 c 1的摄像机 1 中查看该点,将摄像机 2 称为 c 2,依此类推。

所以,我们可以这样写:

P= T 1 P c 1
P= T 2 P c 2

.
.
P= T N P c N

据我了解,您需要从起点开始旋转相机(假设相机在第 1 帧中旋转为零)。因此,您可以用 P c 1而不是 P board来表示每个后续帧。

所以,我们可以说
T 2 P c 2 = T 1 P c 1
或者, P c 2 = T 2 -1 T 1 P c 1
同样, P c N = T N -1 T 1 P c 1

您可以通过查看 T N -1 T 1的旋转部分来恢复 R N以从相机位置 N 到相机位置 1 取点。

于 2016-05-09T22:37:14.617 回答