在世界坐标下是什么意思?如果您的意思是对象坐标,那么您应该使用solvepnp 的结果的逆变换。
给定一个视图矩阵[R|t],我们有inv([R|t]) = [R'|-R'*t],其中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 和 tvec。 rvec 是图像上看到的模式视图的旋转矩阵的紧凑表示。也就是说,rvec 与相应的tvec 一起将基准模式从模型坐标空间(其中指定了对象点)带到相机坐标空间。
也就是说,我们在相机坐标空间中,它随着相机移动,相机始终在原点。相机轴与图像轴具有相同的方向,所以
- x轴指向相机右侧,
- y 轴指向下方,
- 并且z轴指向相机视图的方向
同样适用于模型坐标空间,所以如果你在基准图案的右上角指定原点,那么
- x 轴指向右侧(例如,沿着图案的较长边),
- y 轴指向另一侧(例如沿着较短的一侧),
- z 轴指向地面。
您可以将世界原点指定为对象的第一个点,即第一个对象的点设置为(0, 0, 0),所有其他点都有z=0(在平面图案的情况下)。然后tvec(合并rvec)指向您放置基准图案的世界坐标空间的原点。 solvePnP 的输出与对象点的单位相同。
查看以下内容:6dof positional tracking。我认为这与您需要的非常相似。