在matlab中校正立体图像时出现的问题

Problems while rectifying stereo images in matlab

我正在尝试使用立体成像进行 3D 重建,但是当我使用 matlab 中的教程和工具进行立体视觉时,我得到了错误的结果。我使用 Loreo 3D 微距镜头在 23 毫米左右的距离拍摄小型仪器的图像。然后在裁剪图像以创建左右图像后,我使用立体校准应用程序(我还使用了 matlab 教程中的代码,它做的事情几乎相同)。这些是我得到的结果。 Stereo calibration using matlab's app 我知道重投影误差相当高,但我已经尝试了很多方法,例如改变图像数量、照明、棋盘尺寸和应用程序中的偏斜、切向失真和系数来降低这个值,但没有任何运气。乍一看,右下角的外在重建看起来很准确,因为尺寸非常正确。因此,当我将导出的 stereoParameters 与新图像和下一个代码一起使用时:

Isv = imread('IMG_0036.JPG');
I1 = imcrop(Isv, [0 0 2592 3456]);

I2 = imcrop(Isv, [2593 0 2592 3456]);

% Rectify the images.
[J1, J2] = rectifyStereoImages(I1, I2, stereoParams, 'OutputView', 'valid');

% Display the images before rectification.
figure;
imshow(stereoAnaglyph(I1, I2), 'InitialMagnification', 30);
title('Before Rectification');

% Display the images after rectification.
figure;
imshow(stereoAnaglyph(J1, J2), 'InitialMagnification', 30);
title('After Rectification');

disparityRange = [0, 64];
disparityMap = disparity(rgb2gray(J1), rgb2gray(J2), 'DisparityRange', ...
    disparityRange);
figure;
imshow(disparityMap, disparityRange, 'InitialMagnification', 30);
colormap('jet');
colorbar;
title('Disparity Map');
point3D = reconstructScene(disparityMap, stereoParams);

% Convert from millimeters to meters.
point3D = point3D / 1000;
% Plot points between 3 and 7 meters away from the camera.
z = point3D(:, :, 3);
maxZ = 7;
minZ = 3;
zdisp = z;
zdisp(z < minZ | z > maxZ) = NaN;
point3Ddisp = point3D;
point3Ddisp(:,:,3) = zdisp;
figure
pcshow(point3Ddisp, J1, 'VerticalAxis', 'Y', 'VerticalAxisDir', 'Down' );
xlabel('X');
ylabel('Y');
zlabel('Z');

我得到了这些错误的纠正、视差和 3D 重建。 Rectification, disparity and erroneous 3D reconstruction 可以看出,整改看起来很糟糕,因为我认为对象太分离了;差异结果看起来也很随机,最后 3D 重建根本没有可辨别的结果。 请就此问题寻求任何可能的帮助、意见或建议。

你的重投影误差确实很高...暂且不谈,你最直接的问题是 disparityRange 太小了。

修正后的图像看起来不错。相应的点似乎在两个图像中的相同像素行上,这就是您想要的。使用 imtool 显示校正图像的立体图,并使用标尺小部件测量一些对应点之间的距离。这应该让您了解差异范围应该是多少。 [0 64] 肯定太小了。

为了改善重投影误差,通常我会说获取更多图像。但是你已经有 30 对了,这是一个不错的数字。您可以指定初始内在函数和失真,如果您可以使它们脱离相机制造商的规范,但我怀疑它们在这里是否有帮助。尝试打开切向失真估计,并尝试使用 3 个径向失真系数而不是两个。

另外,看看你能不能把你的相机离场景更远一点。可能是这么短的距离,针孔相机模型就开始坏了。

您还可以做一些事情来改善视差和 3D 重建:

  • 尝试改变 disparity 函数的 BlockSize 参数
  • 尝试在计算视差之前对已校正图像应用直方图均衡and/or低通滤波
  • 尝试对生成的视差图进行中值滤波以减少噪声

另一个提示:由于您大致知道感兴趣的对象相对于相机的位置,因此您可以简单地排除 z 坐标太大或两个小(或负)的 3D 点。这应该会给你一个更清晰的 3D 图。您的代码中已有此内容,但您应该修改它以具有适当的 Z 单位和阈值。