matlab中立体图像的校正问题

matlab中立体图像的校正问题,matlab,3d,computer-vision,matlab-cvst,stereo-3d,Matlab,3d,Computer Vision,Matlab Cvst,Stereo 3d,我试图使用立体成像进行三维重建,但是当我使用matlab中的教程和工具进行立体视觉时,我得到了错误的结果。我使用Loreo 3D微距镜头拍摄距离约为23毫米的小型仪器的图像。然后在裁剪图像以创建左图像和右图像后,我使用了立体声校准应用程序(我还使用了matlab教程中的代码,它做了几乎相同的事情)。这些就是我得到的结果。 我知道重投影错误非常高,但我尝试了很多方法,比如改变图像数量、照明、棋盘格大小以及应用程序中的倾斜、切向失真和系数,以在没有任何运气的情况下降低该值。乍一看,右下角的外部重建看

我试图使用立体成像进行三维重建,但是当我使用matlab中的教程和工具进行立体视觉时,我得到了错误的结果。我使用Loreo 3D微距镜头拍摄距离约为23毫米的小型仪器的图像。然后在裁剪图像以创建左图像和右图像后,我使用了立体声校准应用程序(我还使用了matlab教程中的代码,它做了几乎相同的事情)。这些就是我得到的结果。 我知道重投影错误非常高,但我尝试了很多方法,比如改变图像数量、照明、棋盘格大小以及应用程序中的倾斜、切向失真和系数,以在没有任何运气的情况下降低该值。乍一看,右下角的外部重建看起来很精确,因为尺寸非常正确。因此,当我将导出的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');
Isv=imread('IMG_0036.JPG');
I1=imcrop(Isv,[0 0 0 2592 3456]);
I2=imcrop(Isv,[2593 0 2592 3456]);
%纠正图像。
[J1,J2]=整流系统立体图像(I1,I2,立体参数,'OutputView','valid');
%显示校正前的图像。
图形
imshow(立体浮雕(I1,I2),“初始放大”,30);
标题(“整改前”);
%显示校正后的图像。
图形
imshow(立体浮雕(J1,J2),“初始放大”,30);
标题(“整改后”);
disparityRange=[0,64];
disparityMap=视差(rgb2gray(J1)、rgb2gray(J2)、‘DisparityRange’、。。。
差异范围);
图形
imshow(disparityMap,disparityRange,'初始放大',30);
彩色地图(‘jet’);
色条;
标题(“差异图”);
point3D=重建场景(disparityMap、stereoParams);
%将毫米转换为米。
point3D=point3D/1000;
%打印距离摄影机3到7米之间的点。
z=点3D(:,:,3);
maxZ=7;
minZ=3;
zdisp=z;
zdisp(zmaxZ)=NaN;
point3Ddisp=point3D;
点3DDISP(:,:,3)=zdisp;
图形
pcshow(点3DDISP,J1,‘垂直轴’、‘Y’、‘垂直轴方向’、‘向下’);
xlabel('X');
ylabel('Y');
兹拉贝尔('Z');
我得到了这些错误纠正,视差和三维重建。 可以看出,整改看起来很糟糕,因为在我看来,整改对象过于分散;此外,视差结果看起来非常随机,最后三维重建根本没有明显的结果。
请允许我就这个问题寻求任何可能的帮助、意见或建议。

您的重投影错误确实很高。。。暂时撇开这一点不谈,最直接的问题是
disparityRange
太小

校正后的图像看起来很好。在两幅图像中,对应的点似乎位于相同的像素行上,这正是您想要的。使用
imtool
显示校正图像的立体图,并使用标尺小部件测量一些对应点之间的距离。这会让你知道你的差距应该是多少。[0 64]绝对太小了

为了改善重投影错误,通常我会说获得更多图像。但你们已经有30对了,这是一个不错的数字。你可以指定初始的本质和失真,如果你能让他们离开相机制造商的规格,但我怀疑他们会在这里有所帮助。尝试启用“切向失真估计”,并尝试使用3个径向失真系数而不是两个

此外,请查看是否可以将更多摄影机放置在离场景更远的位置。可能是在如此短的距离内,针孔相机模型开始出现故障

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

  • 尝试改变
    差异
    函数的
    块大小
    参数
  • 在计算视差之前,尝试对校正后的图像应用直方图均衡化和/或低通滤波
  • 尝试对生成的视差贴图进行中值滤波以减少噪声

另一个提示:由于您大致知道感兴趣的对象相对于摄影机的位置,因此可以简单地排除z坐标过大或过小(或负值)的3D点。这将为您提供更清晰的3D绘图。您的代码中已经有了这一点,但是您应该修改它,使其具有适当的Z单位和阈值。

可能您的disparityRange太小了。我已经在imtool命令的帮助下增加了差异范围,事实证明这非常有帮助。我现在得到了一个更清晰的场景三维重建,但它仍然是相当混乱和不准确的,可能是因为高重投影错误。你知道减少这些的方法吗?我在应用程序中看到,有一种方法可以引入相机的固有参数和初始径向畸变,但是我还没有找到一种方法来计算这些参数,是否有任何matlab命令或教程用于此?