如何确定OpenCV中世界空间(不是Charuco板的方向)的摄像机旋转?

时间:2016-05-03 02:00:56

标签: opencv aruco

在OpenCV中,我使用Charuco板,校准了相机,并使用SolvePnP来获得rvec和tvec。 (类似于示例代码)。我正在使用固定板,在圆形钻机上使用摄像头绕轨道运行。我是这样的菜鸟,所以如果这是我想念的那么简单,请耐心等待。

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

假设您从相机中捕获了N帧的Charuco板。然后,你有N个转换,将相机框架中的一个点转移到Charuco板框架中的相同点。这是从每一帧的Charuco板姿势中获得的。

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

T 4x4 = [R 3x3 ,t 3x1 < /子>; 0 1x3 ,1]

如果我们从电路板坐标系中查看点P并将其称为P board 。同样地,我们从相机1(称为c 1 ),相机2(c 2 )等角度来看这一点。

所以,我们可以写:

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



P board = 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 N 以从摄像机位置N到摄像机位置1取点>Ť<子> 1