本篇博客主要讨论opencv中两个函数中几何变换(矩阵)的对应关系,以下函数接口摘自opencv-2.4.8官方文档
1.Finds an object pose from 3D-2D point correspondences.
bool solvePnP(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int flags=ITERATIVE )
2.Projects 3D points to an image plane.
void projectPoints(InputArray objectPoints, InputArray rvec, InputArray tvec, InputArray cameraMatrix, InputArray distCoeffs, OutputArray imagePoints, OutputArray jacobian=noArray(), double aspectRatio=0 )
根据说明,可以看出,函数solvepnp
接收一组对应的3D坐标和2D坐标,计算得到两组坐标对应的几何变换(旋转矩阵rvec
,平移矩阵tvec
);
函数projectPoints
与之相反,根据所给的3D坐标和已知的几何变换来求解投影后的2D坐标。
在空间几何变换中,很多时候会涉及到由坐标A变换到B或B变换到A类似容易弄混的情况(即一些矩阵和其逆矩阵具有不同应用场景的特性),一旦把变换矩阵的对象弄反,结果将南辕北辙。本文将通过代码实验的方式来验证,上述两个函数在所给变换一致(即tvec
和rvec
相同)的情况下,所关联的空间点2D、3D坐标是否一致。
首先,给出小孔相机模型和一组3D点
camara=⎡⎣⎢⎢⎢fx000fy0