我已经尝试过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),
);
我没有改善结果。
有人遇到过类似的问题吗?有什么事吗
最佳答案
我首先使用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);
关于opencv - 使用OpenCV cvStereoCalibrate校准具有不同分辨率的一对摄像机时出现较大的重新投影错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23213930/