重新投影calibrateCamera和projectPoints

时间:2016-06-18 21:29:02

标签: opencv image-processing computer-vision camera-calibration

我正在使用OpenCV' calibrateCamera并试图了解它如何计算重投影错误以及此错误代表的内容。它似乎是投影点和测量图像点之间(欧几里得)距离的RMS - 这是对的吗?但是,最终的重投影误差是什么意思最小化"? calibrateCamera()明确使用函数projectPoints()来查找投影点吗?

4 个答案:

答案 0 :(得分:1)

重投影误差是用估计的内在矩阵和外在矩阵重新投影的3D点与通过某些图像处理技术(例如棋盘图案的角落)检测到的2D图像点之间的误差(例如欧几里德距离)。

最终重投影误差被最小化,因为估计内部和外部参数集的问题是非线性问题,因此您必须找到一组参数,以迭代地最小化此重投影误差。

更多信息:A Flexible New Technique for Camera Calibration ; Zhengyou Zhang ; 2000

答案 1 :(得分:0)

我指的是OpenCV 3.1.0版,在这里您可以找到calibrateCamera的文档 http://docs.opencv.org/3.1.0/d9/d0c/group__calib3d.html#ga687a1ab946686f0d85ae0363b5af1d7b和文档说(粗体是我的):

  

该算法执行以下步骤:

     

计算初始内在参数(该选项仅可用   对于平面校准模式)或从输入读取它们   参数。失真系数最初都设置为零   除非一些CV_CALIB_FIX_K?是指定的。

     

估计最初的   相机姿势好像内在参数已经知道。   这是使用solvePnP完成的。

     

运行全球Levenberg-Marquardt   优化算法最小化重投影错误,即   观察到的特征点之间的平方距离的总和   imagePoints和投影(使用相机的当前估计值   参数和姿势)对象指向objectPoints。看到   projectPoints了解详情。

     

该函数返回最终的重新投影错误

无论如何,我不想依赖文档,而是希望看一下代码:

https://github.com/Itseez/opencv/blob/3.1.0/modules/calib3d/src/calibration.cpp#L3298

答案 2 :(得分:0)

使用main.ts时,需要在重投影后手动计算RMS。这可能有所帮助。 OPENCV: Calibratecamera 2 reprojection error and custom computed one not agree

答案 3 :(得分:-1)

以下是OpenCV代码calibrate.cpp第1629行的重投影误差计算:

返回std :: sqrt(reprojErr / total);

其中total是所有图像的所有点的总和。