单张图像的相机校准?它似乎工作,但我错过了什么?

时间:2015-01-07 14:03:45

标签: c++ opencv camera-calibration

我必须做相机校准。我理解一般概念并且我有它的工作,但在许多指南中它说要使用许多图像或至少两个具有不同方向。为什么这有必要?我似乎通过14x14点的单个图像获得了相当不错的结果:

Calibration image

Restored calibration image 我找到了cv :: findCirclesGrid的点,并使用cv :: calibrateCamera来查找外部和内部参数。内在猜测设置为false。当切向失真 固定为零时,主点和纵横比固定。

然后我使用cv :: getOptimalNewCameraMatrix,cv :: initUndistortRectifyMap和cv :: remap来恢复图像。

在我看来,结果非常好,但我错过了什么吗?它实际上是错的,只是等待以后给我带来问题吗?

此外,在你问我为什么不只是使用多个图像以确定;我正在编写的软件将与半固定相机支架一起使用,一次一个地校准多个相机。因此,首先需要修改支架,以便将图案定位在一个角度或偏离中心,因为目前它只能移近或远离。其次,不应该通过捕获更多图像来不必要地减慢过程。

编辑:要向Micka询问“如果您的视角在图案上不是90°会发生什么?您可以尝试将图案旋转离开相机吗?”。我得到了一个类似的结果,虽然它发现了更少的失真。从用尺子看边界看来,90°的校准似乎更好,但实在很难说。

2 个答案:

答案 0 :(得分:2)

正如here所述,圆形图案(理论上)只与单个图像相处得很好。您需要多个图像的原因是输入数据中存在噪声。

我的建议是比较不同输入图像的结果。如果误差很小,您可能可以使用一个样本。

答案 1 :(得分:1)

有必要在不同的方向上具有更多的图案,以避免内在参数非常不准确但由于不同的误差进行补偿而使不失真的像素重投影误差仍然很低的情况。

为了说明这一点:如果仅以90度的视角拍摄一张图像,则与从侧面稍微观察一下图案相比,水平焦距的变化很难分辨。将两个参数区分开的唯一线索是线的锥度,但是测量结果非常嘈杂。因此,您需要大角度的多个视图才能将姿势的这一方面与固有参数分开。

如果您知道以90度观看图像,则可以利用它来发挥自己的优势,但是需要修改opencv算法。如果确定可以从与校准图像相同的姿势中捕获所有图像,那么这并不重要,因为即使各个校准参数不准确但可以补偿(即它们可以很好地补偿此特定姿势),失真也不会太好,但其他姿势的效果不佳。