我已经设置了两个摄像机并分别进行了校准,之后我使用stereoCalibrate
功能对两个摄像机进行了校准。校准似乎效果很好,因为所有返回的重投影误差都在0.4到0.5的范围内。现在我想从立体图像对中计算深度图。在我可以按照教程进行的操作中,我首先需要校正图像,对图像进行灰度处理,然后将其传递给StereoBM(或任何其他匹配器)。
据我所知,以下代码应纠正并显示两台摄像机的实时图像。
... Load calibration matrices
//compute rectification
Mat R1, R2, P1, P2, Q;
stereoRectify(cameraMatrix_left, distortionCoefficients_left,
cameraMatrix_right, distortionCoefficients_right,
Size(left_camera.get(CAP_PROP_FRAME_WIDTH),
left_camera.get(CAP_PROP_FRAME_HEIGHT)),
R, T, R1, R2, P1, P2, Q, 0, 0.0,
Size(left_camera.get(CAP_PROP_FRAME_WIDTH),
left_camera.get(CAP_PROP_FRAME_HEIGHT)));
//compute undistortion
Mat rmap[2][2];
initUndistortRectifyMap(cameraMatrix_left, distortionCoefficients_left, R1, P1, Size(left_camera.get(CAP_PROP_FRAME_WIDTH), left_camera.get(CAP_PROP_FRAME_HEIGHT)), CV_16SC2, rmap[0][0], rmap[0][1]);
initUndistortRectifyMap(cameraMatrix_right, distortionCoefficients_right, R2, P2, Size(right_camera.get(CAP_PROP_FRAME_WIDTH), right_camera.get(CAP_PROP_FRAME_HEIGHT)), CV_16SC2, rmap[1][0], rmap[1][1]);
while (true) {
if (!right_camera.read(capturedFrame_right))
break;
if (!left_camera.read(capturedFrame_left))
break;
remap(capturedFrame_left, drawFrame_left, rmap[0][0], rmap[0][1], INTER_LINEAR, BORDER_DEFAULT, Scalar());
remap(capturedFrame_right, drawFrame_right, rmap[1][0], rmap[1][1], INTER_LINEAR, BORDER_DEFAULT, Scalar());
cvtColor(drawFrame_left, grayScale_left, COLOR_RGB2GRAY);
cvtColor(drawFrame_right, grayScale_right, COLOR_RGB2GRAY);
imshow(RIGHT_CAMERA, grayScale_right);
imshow(LEFT_CAMERA, grayScale_left);
}
我希望两张图像都能像the documentation of stereoRectify所示那样得到校正。
但是,事实并非如此。两张图片之间存在明显的垂直差异。 我想念什么?
答案 0 :(得分:0)
您需要检查校准是否正确。为该摄像机加载了正确的校准矩阵,它应提供具有上述代码的校正图像。
有一些在互联网上进行立体声校准的指南。这里很少列出。