世界坐标下是什么意思?如果您指的是对象坐标,那么您应该使用以下内容的逆变换solvepnp
的结果。
给定一个视图矩阵[R|t]
,我们有那个inv([R|t]) = [R'|-R'*t]
, where R'
是转置R
。在 OpenCV 中:
cv::Mat rvec, tvec;
cv::solvePnP(objectPoints, imagePoints, intrinsics, distortion, rvec, tvec);
cv::Mat R;
cv::Rodrigues(rvec, rotation);
R = R.t(); // inverse rotation
tvec = -R * tvec; // translation of inverse
// camPose is a 4x4 matrix with the pose of the camera in the object frame
cv::Mat camPose = cv::Mat::eye(4, 4, R.type());
R.copyTo(camPose.rowRange(0, 3).colRange(0, 3)); // copies R into camPose
tvec.copyTo(camPose.rowRange(0, 3).colRange(3, 4)); // copies tvec into camPose
更新#1:
的结果solvePnP
solvePnP
在给定一组对象点(模型坐标)、其相应的图像投影(图像坐标)以及相机矩阵和畸变系数的情况下估计对象姿态。
物体姿态由两个向量给出,rvec
and tvec
. rvec
是图像上看到的图案视图的旋转矩阵的紧凑表示。那是,rvec
连同相应的tvec
带来基准模式从模型坐标空间(其中指定对象点)到相机坐标空间.
也就是我们在相机坐标空间中,它随着相机移动,并且相机始终在原点。相机轴与图像轴具有相同的方向,因此
- x 轴指向相机的右侧,
- y 轴指向下方,
- z轴指向相机视图的方向
这同样适用于模型坐标空间,因此如果您在基准图案的右上角指定原点,则
- x 轴指向右侧(例如沿着图案的较长一侧),
- y 轴指向另一侧(例如,沿着较短的一侧),
- z轴指向地面。
您可以将世界原点指定为对象点的第一个点,即第一个对象设置为(0, 0, 0)
并且所有其他点都有z=0
(对于平面图案)。然后tvec
(结合rvec
) 指向放置基准图案的世界坐标空间的原点。solvePnP
的输出具有与对象点相同的单位。
请看以下内容:6自由度位置跟踪 http://franklinta.com/2014/09/30/6dof-positional-tracking-with-the-wiimote/。我认为这与您的需要非常相似。