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

时间:2012-06-30 11:06:48

标签: opencv camera-calibration

我有一组刚体的图像,附有一些标记。我在其中一个标记中定义了一个带原点的坐标系,我希望得到这个坐标系与相机原点定义的坐标系之间的旋转和平移。

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

  1. 重新投影错误是否太高?我怎样才能改进它? (我使用了更多图像,只是略微降低了值)。
  2. 我可以在POSIT中使用失真参数吗?怎么样?
  3. 感谢。


    似乎减少重投影错误(从~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度。

    有谁知道我哪里出错?

1 个答案:

答案 0 :(得分:2)

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