使用OpenCV cvStereoCalibrate校准具有不同分辨率的一对相机时出现大的重投影错误

时间:2014-04-22 08:06:08

标签: opencv camera

我已经尝试过OpenCV cvStereoCalibrate功能来校准一对立体相机。它在校准具有相同分辨率的一对相机时工作正常。但是当我尝试校准分辨率非常不同的一对相机时(右图像大约是左图像的10倍)。我得到了很大的重投影错误而且没有非常有意义的结果。

以下是我在程序中调用cvStereoCalibrate的代码部分:

rpErr = cvStereoCalibrate( &_objectPoints, &_imagePoints1,
    &_imagePoints2, &_npoints,
    &_M1, &_D1, &_M2, &_D2,
    imageSize, &_R, &_T, &_E, &_F,
    cvTermCriteria(CV_TERMCRIT_ITER+
    CV_TERMCRIT_EPS, 100, 1e-5),
    CV_CALIB_ZERO_TANGENT_DIST);

如果还试过

rpErr = cvStereoCalibrate( &_objectPoints, &_imagePoints1,
    &_imagePoints2, &_npoints,
    &_M1, &_D1, &_M2, &_D2,
    imageSize, &_R, &_T, &_E, &_F,
    cvTermCriteria(CV_TERMCRIT_ITER+
    CV_TERMCRIT_EPS, 100, 1e-5),
);

我没有改善结果。

以前遇到类似问题的人?可能有什么不对?

1 个答案:

答案 0 :(得分:2)

我首先使用cvCalibrateCamera2对每个摄像头进行了单独的内在校准,然后将输出用于cvStereoCalibrate(使用参数CV_CALIB_FIX_INTRINSIC)。这给了我小的重投影错误和非常有意义的结果。

似乎没有必要调整较大图像的大小。在cvStereoCalibrate中,我们可以将imageSize设置为一个摄像机图像的大小。由于此参数仅对内部相机校准中的初始化有用(根据openCV文档),如果使用参数CV_CALIB_FIX_INTRINSIC调用cvStereoCalibrate,则不使用该参数。

以下是代码的一部分

rpErr_intrinsic1 = cvCalibrateCamera2(& _objectPoints,& _imagePoints1,           & _npoints,imageSize1,& _M1,& _D1,NULL,NULL,
                  CV_CALIB_ZERO_TANGENT_DIST);

rpErr_intrinsic2 = cvCalibrateCamera2(& _objectPoints,& _imagePoints2,           & _npoints,imageSize2,& _M2,& _D2,NULL,NULL,
                  CV_CALIB_ZERO_TANGENT_DIST);

rpErr = cvStereoCalibrate(& _objectPoints,& _imagePoints1,         & _imagePoints2,& _npoints,         & _M1,& _D1,& _M2,& _D2,         imageSize,& _R,& _T,& _E,& _F,         cvTermCriteria(CV_TERMCRIT_ITER +         CV_TERMCRIT_EPS,100,1e-5),     CV_CALIB_FIX_INTRINSIC +     CV_CALIB_ZERO_TANGENT_DIST);