对于您的第一个问题,在这种情况下,您需要分别找到每个图像的角。例如:
found1 = findChessboardCorners(img1, board_sz, corners1, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
found2 = findChessboardCorners(img2, board_sz, corners2, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
其中 board_sz 是棋盘的大小,corners1 是图像 1 中棋盘的角,图像 2 也是如此(有关更多详细信息,请参阅 openCV 参考:http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findchessboardcorners)
对于第二个问题,您不应单独校准每个相机。 stereoCalibrate 为您完成工作并存储内部参数(cameraMatrix1、distCoeffs1 用于 camera1 和 cameraMatrix2、distCoeffs2 用于 camera2)和外部参数(R、T、E、F,它们是旋转、平移、基本矩阵和基本矩阵):
double stereoCalibrate(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, InputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, Size imageSize, OutputArray R, OutputArray T, OutputArray E, OutputArray F, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6), int flags=CALIB_FIX_INTRINSIC
请注意,内在参数和外在参数是输入/输出。
这里的 imagePoints1 和 imagePoints2 是一个角点列表,因为你需要拍几张不同姿势的棋盘照片。所以,你会做这样的事情(对于每张图片):
if (found1 && found2)
{
imagePoints1.push_back(corners1);
imagePoints2.push_back(corners2);
objectPoints.push_back(obj);
printf ("Corners stored\n");
success++;
}
如果您需要更多详细信息,请参阅此帖子:http://www.jayrambhia.com/blog/stereo-calibration/