我有一个面向类似棋盘的相机。我知道这些点在世界坐标系中的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);
我可以使用projectPoints将三维世界点转换为二维图像点:
std::vector<Point2f> projPoints;
projectPoints(objPoints, rvec, tvec, camMat, distCoeffs, projPoints);
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;