OpenCV 项目点的逆向

gre*_*til 5 opencv pose-estimation

我有一个面向棋盘的相机。我知道点的世界 3d 位置以及相机图像上相应投影点的 2d 位置。所有世界点都属于同一平面。我使用solvePnP:

Matx33d camMat;
Matx41d distCoeffs;
Matx31d rvec;
Matx31d tvec;
std::vector<Point3f> objPoints;
std::vector<Point2f> imgPoints;
solvePnP(objPoints, imgPoints, camMat, distCoeffs, rvec, tvec);
Run Code Online (Sandbox Code Playgroud)

然后我可以使用 projectPoints 从 3d 世界点到 2d 图像点:

std::vector<Point2f> projPoints;
projectPoints(objPoints, rvec, tvec, camMat, distCoeffs, projPoints);
Run Code Online (Sandbox Code Playgroud)

projPoints 非常接近 imgPoints。

如何使用与属于同一平面的 3d 世界点相对应的屏幕点进行相反的操作。我知道从单一的角度来看,不可能重建 3d 位置,但在这里我在同一平面上,所以这确实是一个 2d 问题。我可以计算反向旋转矩阵以及反向平移向量,但是我该如何进行呢?

Matx33d rot;
Rodrigues(rvec, rot);
Matx33d camera_rotation_vector;
Rodrigues(rot.t(), camera_rotation_vector);
Matx31d camera_translation_vector = -rot.t() * tvec;
Run Code Online (Sandbox Code Playgroud)

gre*_*til 1

这个问题似乎是另一个 Stackoverflow 问题的重复,其中提问者很好地提供了解决方案。这是链接:答案在这里:从图像点计算 x,y 坐标 (3D)