我正在尝试使用立体成像进行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重建根本没有明显的结果。 请关于此问题的任何可能的帮助,意见或建议。
答案 0 :(得分:0)
你的重投影错误确实很高......暂时搁置一旁,你最直接的问题是disparityRange
太小了。
经过纠正的图像看起来很好。相应的点似乎在两个图像中的相同像素行上,这是您想要的。使用imtool
显示已校正图像的立体图,并使用标尺小部件测量某些对应点之间的距离。这应该可以让您了解您的差异范围应该是多少。 [0 64]肯定太小了。
为了改善重投影错误,通常我会说获得更多图像。但是你已经拥有30对,这是一个很好的数字。您可以指定初始内在函数和失真,如果您可以从相机制造商的规范中删除它们,但我怀疑他们会在这里提供帮助。尝试打开切向失真估计,并尝试使用3个径向失真系数而不是两个。
此外,看看你的相机是否可以离场景更远。可能是在如此短的距离内,针孔相机模型开始崩溃。
您还可以采取一些措施来改善视差和3D重建:
BlockSize
功能disparity
参数
另一个提示:由于你大致知道感兴趣的物体相对于相机的位置,你可以简单地排除z坐标太大或两个小(或负)的3D点。这应该会给你一个更清洁的3D情节。您已经在代码中使用了这个,但是您应该修改它以获得Z的适当单位和阈值。