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

Posted

技术标签:

【中文标题】使用 OpenCV cvStereoCalibrate 校准一对不同分辨率的相机时出现大的重投影误差【英文标题】:Big reprojection error while using OpenCV cvStereoCalibrate to calibrate a pair of cameras with different resolution 【发布时间】:2014-04-22 08:06:07 【问题描述】:

我已经尝试过 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),
);

我没有改善结果。

有人遇到过类似的问题吗?有什么问题?

【问题讨论】:

尝试调整大图像的大小以与小图像具有相同的分辨率。请注意,在 stereoCalibrate 中,您传递的是一个图像大小,而不是两个,因此可以为两个图像使用相同的分辨率。 非常感谢您的回复。是的,我忽略了参数 imageSize。我的问题是这两个相机的纵横比不同。一个是 5184*3456 (3:2) 。另一种是1600*1200。如果我将较大的图像调整为与较小的图像相同的大小。我会扭曲图像的纵横比。然后事情变得有点复杂。 据我所知,opencv 不支持不同的图像纵横比。你可以在这里看到答案:***.com/questions/22877869/…希望它有所帮助。 谢谢你,marol。该链接确实有帮助。请在下面查看我的答案。 【参考方案1】:

我首先使用 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, 图像大小,&_R,&_T,&_E,&_F, cvTermCriteria(CV_TERMCRIT_ITER+ CV_TERMCRIT_EPS, 100, 1e-5), CV_CALIB_FIX_INTRINSIC+ CV_CALIB_ZERO_TANGENT_DIST);

【讨论】:

不错。您还可以发布您所租用的校准误差值(对于处理两种不同图像尺寸立体校准问题的人)可能是有用的信息。 您用于 CalibrateCamera 和 stereoCalibrate 的图像是否相同?

以上是关于使用 OpenCV cvStereoCalibrate 校准一对不同分辨率的相机时出现大的重投影误差的主要内容,如果未能解决你的问题,请参考以下文章

opencv 安装 vc14可以在vs10上运行吗

OpenCV学习记录

我是不是需要使用 Gstreamer 构建 OpenCV 才能在 OpenCV 中使用 Gstreamer

opencv中自带的dll和lib 为啥不能直接使用?

OpenCV-IOS 在Xcode中使用时,除了把opencv2.framework拉入项目中,还需要做啥,

使用 opencv_contrib 在 Mac OS 终端中运行 OpenCV