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