相机校准(OpenCV 2.3)- 如何使用畸变参数?

6
我有一组刚体图像和一些附加标记。我定义了一个坐标系,其中一个标记是原点,并且我想要获得该坐标系与相机原点定义的坐标系之间的旋转和平移。

我尝试使用 POSIT(参考this)了一段时间,但从未获得令人满意的结果,直到我意识到我必须首先校准相机。基于this并使用一些用于校准的图像,我获得了相机内部矩阵和畸变参数。我的重投影误差也达到了 1.276,是否太高?如何改善它?(我使用了更多的图像,只实现了轻微的降低)。 我可以在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度。
有人知道我错在哪里吗?

忘了提到我的标定板是一个圆形网格图案,而不是典型的棋盘格。 - pn_
1个回答

2

图像分辨率是多少?主点应靠近图像中心。镜头的焦距是多少?校准误差可能很小,这取决于您需要的精度。为了避免镜头畸变引入的误差,您应该使用undistortPoints来消除传递给POSIT的图像点的畸变。这种误差有多大取决于您的镜头畸变有多大。


我没有关于图像分辨率或焦距的任何信息 - 这就是为什么我进行了校准。从相机矩阵中,我可以得到x和y方向上的焦距以及图像的主点(它靠近图像中心)。我的逻辑有哪里不对吗? - pn_
图像分辨率是您的图像的宽度和高度。您应该知道镜头的实际焦距(8毫米、16毫米等)。图像分辨率和实际焦距确定了应使用校准过程估计的焦距值。顺便问一下,cX和cY不应该是228.655和252.617吗? - Javier Barandiaran Martirena
刚刚明白了,我之前对图像点进行了错误的标记,之前没能发现。感谢你的帮助,Javier! - pn_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接