相机校准 (OpenCV 2.3) - 如何使用失真参数



我有一组带有一些附加标记的刚体图像。我在其中一个标记中定义了一个原点坐标系,我想获取此坐标系与摄像机原点定义的坐标系之间的旋转和平移。

尝试了一段时间POSIT(在此之后)没有得到可接受的结果,直到我意识到我必须首先校准相机。基于此,并使用校准体获取的一些图像,我得到了相机固有矩阵和失真参数。我还得到了一个糟糕的 (?) 重新投影错误 1.276。

  1. 重新投影误差是否太高?我该如何改进它?(我使用了更多的图像,只是实现了值的轻微下降)。
  2. 我可以在POSIT中使用失真参数吗?如何?

谢谢。


似乎减少重新投影错误(从 ~1.3 更改为 ~0.7)的唯一方法是将 XML 配置文件中的以下参数设置为"0":

<Calibrate_FixAspectRatio> 0 </Calibrate_FixAspectRatio>
<Calibrate_AssumeZeroTangentialDistortion> 0 </Calibrate_AssumeZeroTangentialDistortion>
<Calibrate_FixPrincipalPointAtTheCenter> 0 </Calibrate_FixPrincipalPointAtTheCenter>

使用更多图像不会改变错误,我仍然不确定这个新错误是否可以接受。

我在POSIT中使用校准给出的值作为输出(即焦距和光学中心),但结果与使用预校准值时得到的结果非常相似。我没有使用失真参数,因为我不知道如何在POSIT中处理它们(它们会对结果产生影响吗?

校准后我得到的相机矩阵:

<Camera_Matrix type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
2.0613885351075501e+003 0. 2.2865517805186334e+002 0.
2.2546461307897816e+003 2.5261706201677623e+002 0. 0. 1.
</data>
</Camera_Matrix>

以及我在POSIT中使用它的方式:

#define FOCAL_LENGTH 2158.0175
#define FOCAL_LENGTH_X 2061.389 
#define FOCAL_LENGTH_Y 2254.646
#define cX 203.655
#define cY 205.117

计算了新的中心坐标和校准图像之间的差值,然后将该差值应用于我正在使用POSIT的图像的中心坐标。

我在两个不同的图像上使用POSIT,理论上我应该在模型和相机坐标系之间旋转0度(对于第一个)和10度(对于第二个)。在我得到每个图像的旋转矩阵后,我在相机坐标系上定义了一个单位向量,并通过POSIT给出的两个旋转矩阵的倒数将其放大计算在模型坐标系上,从而在模型坐标系中得到两个新向量。当我计算模型坐标系中这两个向量之间的角度时,输出不是应有的 - 10 度。

有谁知道我哪里出错了?

图像分辨率是多少?主点应靠近影像中心。镜头的焦距是多少?该校准误差可能很好,具体取决于您需要的精度。为了避免镜头失真带来的误差,您应该使用undisdistortionPoints对传递给POSIT的图像点进行不失真。这个误差有多大取决于镜头的失真有多大。

最新更新