2012-06-30 39 views
6

我有一组带有一些附加标记的刚体图像。我在这些标记中的一个中定义了具有原点的坐标系,并且我希望获得该坐标系和相机原点处定义的坐标系之间的旋转和平移。摄像机标定(OpenCV 2.3) - 如何使用失真参数?

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

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

谢谢。


看来,只有这样,才能在投影误差的减少(从改变〜1.3〜0.7)是通过设置为“0”的XML配置文件中的下列参数:

<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度。

有没有人有一个想法,我哪里错了?

+0

忘了提及我的校准机构是一个圆形网格图案,而不是典型的棋盘。 –

回答

2

哪个是图像分辨率?主要观点应该靠近形象中心。这是镜头的焦距?校准错误可能会很好,这取决于您所需的精度。 为了避免由于镜头失真而引起的错误,您应该使用undistortPoints将传递给POSIT的图像点无畸变。这个错误有多大取决于镜头失真的程度。

+0

我没有关于图像分辨率和焦距的任何信息 - 这就是我进行校准的原因。从相机矩阵中,我得到x和y中的焦距以及图像的主要点(它靠近图像中心)。我的逻辑错了吗? –

+0

图像分辨率是图像的宽度和高度。您应该知道镜头的实际焦距(8mm,16mm,...)。图像分辨率和实际焦距决定了校准过程中应该估算的焦距值。顺便说一句,不应该cX和cY是228.655和252.617? –

+0

刚刚得到它..我做了一个错误的图像点标签,无法提前发现它。感谢您的帮助Javier! –