首页 文章

在matlab中纠正立体图像时的问题

提问于
浏览
2

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

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重建根本没有明显的结果 . 请关于此问题的任何可能的帮助,意见或建议 .

1 回答

  • 0

    你的重投影错误确实很高......暂时抛开这一点,你最直接的问题是 disparityRange 太小了 .

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

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

    此外,看看你的相机是否可以离场景更远 . 可能在如此短的距离处针孔相机模型开始分解 .

    您还可以采取一些措施来改善视差和3D重建:

    • 尝试改变 disparity 函数的 BlockSize 参数

    • 在计算差异之前,尝试对经过校正的图像应用直方图均衡和/或低通滤波

    • 尝试对得到的视差图进行中值滤波以减少噪声

    另一个提示:由于你大致知道感兴趣的物体相对于相机的位置,你可以简单地排除z坐标太大或两个小(或负)的3D点 . 这应该会给你一个更清洁的3D情节 . 您已经在代码中使用了此代码,但是您应该修改它以获得Z的适当单位和阈值 .

相关问题