从给定的世界点(原始坐标)、内在矩阵、旋转矩阵和平移向量计算重投影点、重投影误差和平均重投影误差的过程是什么?
有没有内置的opencv函数,或者我们应该计算manuallay?
如果我们必须手动计算,获得重投影点的最佳方法是什么?
projectPoints
将 3D 点投影到图像平面。
calibrateCamera
返回最终的重投影误差。 calibrateCamera
从校准图案的多个视图中找到相机的内在和外在参数。
该函数估计相机的内在参数和外在参数 每个视图的参数。该算法基于 [Zhang2000]1 和 [BouguetMCT]2。 3D 物体点的坐标和 必须指定它们在每个视图中相应的 2D 投影。 这可以通过使用具有已知几何形状的物体来实现 容易检测到的特征点。这样的对象称为 校准装置或校准模式,OpenCV 内置 支持棋盘作为校准装置(参见
)。findChessboardCorners()
该算法执行以下步骤:
计算初始内在参数(该选项仅可用 对于平面校准图案)或从输入中读取它们 参数。失真系数最初全部设置为零 除非指定了某些
。CV_CALIB_FIX_K?
估计初始值 相机的姿势就好像内部参数已经知道一样。 这是使用
完成的。solvePnP()
运营全球 Levenberg-Marquardt 最小化重投影误差的优化算法,即 观察到的特征点之间距离的平方总和
和预计的(使用相机的当前估计 参数和姿势)对象点imagePoints
。看objectPoints
了解详情。该函数返回最终结果 重投影错误。projectPoints()
1张正友。一种灵活的相机校准新技术。 模式分析和机器智能,IEEE Transactions on,2000,22.11:1330-1334。
2J.Y.布盖。 MATLAB 校准工具。 http://www.vision.caltech.edu/bouguetj/calib_doc/
基于张的校准纸的 openCV 的 calibrateCamera() 就是您所需要的 https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr98-71.pdf
为了让这个答案简短,我无法在这里解释数学。
以下是该过程的简短摘要:
为此,您将需要 opencv,但为了简单起见,您可以使用 Python 版本的 opencv 来完成相同的操作,但会牺牲性能
https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#ga687a1ab946686f0d85ae0363b5af1d7b
祝你好运!