【发布时间】:2016-12-01 14:34:32
【问题描述】:
我有两个水平设置的摄像机(彼此靠近)。我有左摄像头 cam1 和右摄像头 cam2。
首先我校准相机(我想校准 50 对图像):
- 我使用 cv::calibrateCamera() 分别校准两个摄像头
- 我使用 cv::stereoCalibrate() 校准立体声
我的问题:
- 在 stereoCalibrate - 我认为相机数据的顺序很重要。如果来自左侧摄像头的数据应该是 imagePoints1,而来自右侧摄像头的数据应该是 imagePoints2,反之亦然,或者只要程序的每个点的摄像头顺序相同,这并不重要?
- 在 stereoCalibrate - 我得到大约 15,9319 的 RMS 误差和大约 8,4536 的平均重投影误差。如果我使用来自相机的所有图像,我会得到该值。在其他情况下:首先我保存图像,我选择整个棋盘可见的对(所有棋盘的方块都在相机视图中,并且每个方块都完整可见)我得到大约 0.7 的 RMS。如果这意味着只有离线校准是好的,如果我想校准相机,我应该手动选择好的图像?或者有什么方法可以在线进行校准?在线是指我开始从相机捕获视图,并且在每个视图中我都找到了棋盘角,并在停止从相机捕获视图后校准相机。
- 我只需要四个失真值,但我得到了其中的五个(使用 k3)。在旧的 api 版本 cvStereoCalibrate2 我只有四个值,但在 cv::stereoCalibrate 我不知道该怎么做?是否有可能或唯一的方法是获取 5 个值并在以后只使用其中的四个?
我的代码:
Mat cameraMatrix[2], distCoeffs[2];
distCoeffs[0] = Mat(4, 1, CV_64F);
distCoeffs[1] = Mat(4, 1, CV_64F);
vector<Mat> rvec1, rvec2, tvec1, tvec2;
double rms1 = cv::calibrateCamera(objectPoints, imagePoints[0], imageSize, cameraMatrix[0], distCoeffs[0],rvec1, tvec1, CALIB_FIX_K3, TermCriteria(
TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON));
double rms2 = cv::calibrateCamera(objectPoints, imagePoints[1], imageSize, cameraMatrix[1], distCoeffs[1],rvec2, tvec2, CALIB_FIX_K3, TermCriteria(
TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON));
qDebug()<<"Rms1: "<<rms1;
qDebug()<<"Rms2: "<<rms2;
Mat R, T, E, F;
double rms = cv::stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
cameraMatrix[0], distCoeffs[0],
cameraMatrix[1], distCoeffs[1],
imageSize, R, T, E, F,
TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
CV_CALIB_FIX_INTRINSIC+
CV_CALIB_SAME_FOCAL_LENGTH);
【问题讨论】:
标签: visual-studio opencv camera-calibration