Opencv 为什么cv::返回大小为(0,0)的ROI

Opencv 为什么cv::返回大小为(0,0)的ROI,opencv,stereo-3d,calibration,Opencv,Stereo 3d,Calibration,我正在学习opencv并测试立体相机。在我的代码中,StereoRective函数有时返回大小为(0,0)的ROI。 我想不出这个问题 Mat cameraMatrix[2], distCoeffs[2]; cameraMatrix[0] = initCameraMatrix2D(objectPoints, imagePoints_l, imageSize, 0); cameraMatrix[1] = initCameraMatrix2D(objectPoints, imagePoints

我正在学习opencv并测试立体相机。在我的代码中,StereoRective函数有时返回大小为(0,0)的ROI。 我想不出这个问题

Mat cameraMatrix[2], distCoeffs[2];
cameraMatrix[0] = initCameraMatrix2D(objectPoints, imagePoints_l, 
  imageSize, 0);
cameraMatrix[1] = initCameraMatrix2D(objectPoints, imagePoints_r, 
  imageSize, 0);

Mat R, T, E, F;
double rms = stereoCalibrate(objectPoints, imagePoints_l, imagePoints_r,
  cameraMatrix[0], distCoeffs[0],
  cameraMatrix[1], distCoeffs[1],
  imageSize, R, T, E, F,
  CALIB_FIX_ASPECT_RATIO +
  CALIB_ZERO_TANGENT_DIST +
  CALIB_USE_INTRINSIC_GUESS +
  CALIB_SAME_FOCAL_LENGTH +
  CALIB_RATIONAL_MODEL +
  CALIB_FIX_K3 + CALIB_FIX_K4 + CALIB_FIX_K5,
  TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 100, 1e-5));

Mat R1, R2, P1, P2, Q;
Rect validRoi[2];

stereoRectify(cameraMatrix[0], distCoeffs[0],
  cameraMatrix[1], distCoeffs[1],
  imageSize, R, T, R1, R2, P1, P2, Q,
  CALIB_ZERO_DISPARITY, 0.5, imageSize, &validRoi[0], &validRoi[1]);

cout << validRoi[0] << validRoi[1] << endl;
或:

我还输出摄像机矩阵和失真矩阵:

[204.3355426705726, 0, 193.3280616575545;
0, 189.8976931576431, 123.307676870377;
0, 0, 1]
[-0.5404320611827982, 0.3292134879059271, 0, 0, 0, 0, 0, 
0.1371856537119246, 0, 0, 0, 0, 0, 0]
[204.3355426705726, 0, 183.756931129648;
0, 189.8976931576431, 131.4500619272754;
0, 0, 1]
[-0.524923482702874, 0.3121043629068334, 0, 0, 0, 0, 0, 
0.1269780773557047, 0, 0, 0, 0, 0, 0]

StereoRective函数可能没有返回有效的ROI。请张贴完整的代码

你以前做过立体声校准吗? 你的输入矩阵是什么?摄像机矩阵是否为立体声校准的输出矩阵? 是否尝试将自由比例参数aplha设置为0?然后ROI覆盖了整个图像。 你能把校正过的图片贴出来吗

以下是OpenCV的完整立体校准示例:

以及StereoRective的OpenCV文档:

首先检查您的校准标志。查看OpenCV文档,您真正需要哪个标志。您可以先尝试,不带任何标志

您是否检查了立体声校准返回的rms值?良好的校准返回的rms小于1

你的图像矫正得好吗?您可以使用以下代码重新映射并显示它:

// remap
Mat rmap[2][2];
initUndistortRectifyMap(cameraMatrix1, distCoeffs1, R1, P1, imageSize, CV_16SC2, rmap[0][0], rmap[0][1]);
initUndistortRectifyMap(cameraMatrix2, distCoeffs2, R2, P2, imageSize, CV_16SC2, rmap[1][0], rmap[1][1]);
Mat out1, out2;
remap(img1, out1, rmap[0][0], rmap[0][1], CV_INTER_LINEAR);
remap(img2, out2, rmap[1][0], rmap[1][1], CV_INTER_LINEAR);
Mat result;
hconcat(out1, out2, result);

// draw horizontal line
for(int j = 0; j < result.rows; j += 16 ) {
    line(result, Point(0, j), Point(result.cols, j), Scalar(0, 255, 0), 1, 8);
}

// show
imshow("result", result);
waitKey();
//重新映射
Mat rmap[2][2];
初始不失真整流映射(CameraMatrix X1,distCoeffs1,R1,P1,imageSize,CV_16SC2,rmap[0][0],rmap[0][1]);
初始不失真校正映射(CameraMatrix X2,distCoeffs2,R2,P2,imageSize,CV_16SC2,rmap[1][0],rmap[1][1]);
Mat out1、out2;
重新映射(img1、out1、rmap[0][0]、rmap[0][1]、CV_INTER_LINEAR);
重新映射(img2、out2、rmap[1][0]、rmap[1][1]、CV_INTER_LINEAR);
Mat结果;
hconcat(out1,out2,result);
//画水平线
对于(int j=0;j
目前(2018年3月31日,opencv 3.4.1),许多用户报告返回无效结果:

[204.3355426705726, 0, 193.3280616575545;
0, 189.8976931576431, 123.307676870377;
0, 0, 1]
[-0.5404320611827982, 0.3292134879059271, 0, 0, 0, 0, 0, 
0.1371856537119246, 0, 0, 0, 0, 0, 0]
[204.3355426705726, 0, 183.756931129648;
0, 189.8976931576431, 131.4500619272754;
0, 0, 1]
[-0.524923482702874, 0.3121043629068334, 0, 0, 0, 0, 0, 
0.1269780773557047, 0, 0, 0, 0, 0, 0]
// remap
Mat rmap[2][2];
initUndistortRectifyMap(cameraMatrix1, distCoeffs1, R1, P1, imageSize, CV_16SC2, rmap[0][0], rmap[0][1]);
initUndistortRectifyMap(cameraMatrix2, distCoeffs2, R2, P2, imageSize, CV_16SC2, rmap[1][0], rmap[1][1]);
Mat out1, out2;
remap(img1, out1, rmap[0][0], rmap[0][1], CV_INTER_LINEAR);
remap(img2, out2, rmap[1][0], rmap[1][1], CV_INTER_LINEAR);
Mat result;
hconcat(out1, out2, result);

// draw horizontal line
for(int j = 0; j < result.rows; j += 16 ) {
    line(result, Point(0, j), Point(result.cols, j), Scalar(0, 255, 0), 1, 8);
}

// show
imshow("result", result);
waitKey();