如何在OpenCV中确定相机在世界空间中的旋转(而不是Charuco板的方向)



在OpenCV中,我使用的是Charuco板,已经校准了相机,并使用SolvePnP获取rvec和tvec。(类似于示例代码)。我使用的是一块固定的木板,上面有一个圆形钻机上的相机,它绕着木板旋转。我对此一无所知,所以如果我缺少一些简单的东西,请耐心等待。

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

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

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

谢谢!

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

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

T4x4=[R3x3,T3x1;01x3如果我们从板坐标系中观察点p并将其称为p。类似地,我们从摄像机1(称为c1)、摄像机2(称为c2,依此类推)观察该点

所以,我们可以写:

P=T1Pc1
P=T2Pc2



P=TNPcN

据我所知,你需要相机的旋转,比如从起点开始(假设相机在第1帧中处于零旋转)。因此,您可以用Pc1而不是P来表示每个后续帧。

所以,我们可以说
T2Pc2=T1Pc1
或者,Pc2=T2-1
T1Pc1
类似地,PcN=TN-1T1Pc1

通过观察TN-1T1的旋转部分,可以恢复从相机位置N到相机位置1的点的RN

最新更新