在OpenCV中,我使用Charuco板,校准了相机,并使用SolvePnP来获得rvec和tvec。 (类似于示例代码)。我正在使用固定板,在圆形钻机上使用摄像头绕轨道运行。我是这样的菜鸟,所以如果这是我想念的那么简单,请耐心等待。
据我所知,我可以使用Rodrigues()从rvec获取板面方向的3x3旋转矩阵,并且我可以使用-Rt()* tvec(在c ++中)将tvec值转换为世界坐标。
然而,据我所知,这个3x3旋转R给出了相对于相机的板的方向,所以它不是什么需要。我想要相机本身的旋转,它通过(我认为)相机空间中tvec和z轴之间的角度从R偏移。 (因为相机并不总是指向电路板原点,但它始终指向相机空间中的z轴)。这是对的吗?
如何找到额外的旋转偏移并将其转换为3x3旋转矩阵,我可以将其与R结合以获得实际的摄像机方向?
谢谢!
答案 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 子>