使用OpenCV cvStereoCalibrate校准一对不同分辨率的摄像机时,重投影误差较大

使用OpenCV cvStereoCalibrate校准一对不同分辨率的摄像机时,重投影误差较大,opencv,camera,Opencv,Camera,我尝试了OpenCV cvStereoCalibrate功能来校准一对立体相机。当校准一对具有相同分辨率的相机时,它工作良好。但当我试着校准一对分辨率非常不同的相机时(右图大约是左图的10倍大)。我得到了很大的重投影错误,结果不是很有意义 下面是我在程序中调用的代码部分: rpErr = cvStereoCalibrate( &_objectPoints, &_imagePoints1, &_imagePoints2, &_npoints, &am

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

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

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),
);
我没有提高成绩


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

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

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

下面是代码的一部分

rpErr_intrinsic1=CVcalibleCamera2(&_objectPoints,&_imagePoints1, &_npoints,imageSize1,&_M1,&_D1,NULL,NULL,
CV(校准零点切线距离)

rpErr_intrinsic2=CVcalibleCamera2(&_对象点,&_图像点2, &_npoints,imageSize2,&_M2,&_D2,NULL,NULL,
CV(校准零点切线距离)

rpErr=cvStereoCalibrate(&_对象点,&_图像点1, &_图像点2和点, &_M1,D1,M2,D2,, 图像大小,图像大小,图像大小,图像大小,图像大小,图像大小,图像大小,图像大小,图像大小,, CVTERM标准(CV_TERMCRIT_ITER+ CV_Term Crit_EPS,100,1e-5), CV_校准_固定_固有+
CV(校准零点切线距离)

尝试调整较大图像的大小,使其具有与较小图像相同的分辨率。请注意,在stereoCalibrate中,您传递的是一个图像大小,而不是两个,因此这是对两个图像使用相同分辨率的提示。非常感谢您的回复。是的,我忽略了参数imageSize。我的问题是这两个摄像头的纵横比不同。一个是5184*3456(3:2)。另一个是1600*1200。如果我将较大的图像调整为与较小图像相同的大小。我将扭曲图像的纵横比。就我所知,opencv不支持不同的图像纵横比。你可以在这里看到答案:希望有帮助。谢谢你,玛洛。这个链接真的很有帮助。请看下面我的答案。您还可以发布租赁的校准误差值(适用于处理两种不同图像大小的立体声校准问题的人员)。您用于校准的图像是否与StereoCalibration相同?