我已经尝试过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),
);
我没有改善结果。
以前遇到类似问题的人?可能有什么不对?
答案 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);