%双目方式验证
%clear
%clc
IL1 = imread('a3.bmp');%读取左右图片
IR1 = imread('b3.bmp');
figure
imshowpair(IL1, IR1, 'montage'); %拼接显示两张图片
title('Original Images');
%加载stereoParameters对象。
load('matlab02.mat');%加载你保存的相机标定的mat
[J1, J2] = rectifyStereoImages(IL1, IR1, stereoParams); %双目校准
figure
imshowpair(J1, J2, 'montage');
title('Undistorted Images');
figure; imshow(cat(3, J1(:,:,1), J2(:,:,2:3)), 'InitialMagnification', 50);%图像显示50%
%{
%让两个物体同时显示,利用到(图像融合,边缘提取)
WL1 = abs(imfilter(rgb2gray(J1), fspecial('Laplacian'), 'replicate', 'conv'));
WL2 = abs(imfilter(rgb2gray(J2), fspecial('Laplacian'), 'replicate', 'conv'));
WL1(WL1(:)>=WL2(:)) = 1;WL1(WL1(:)<WL2(:)) = 0;
WL2(WL1(:)>=WL2(:)) = 0;WL2(WL1(:)<WL2(:)) = 1;
J_F(:,:,1) = J1(:,:,1).*WL1+J2(:,:,1).*WL2;
J_F(:,:,2) = J1(:,:,2).*WL1+J2(:,:,2).*WL2;
J_F(:,:,3) = J1(:,:,3).*WL1+J2(:,:,3).*WL2;
figure; imshow(J_F, 'InitialMagnification', 50);%图像显示50%
%}
disparityMap = disparity(rgb2gray(J1), rgb2gray(J2), 'BlockSize',...
15,'DisparityRange',[0,400],'BlockSize',15,'ContrastThreshold',0.5,'UniquenessThreshold',15);
%{
’DisparityRange’,[0,400]:视差范围,范围可以自己设定,不能超过图像的尺寸,当双目距离较远或者物体距离较近时,应适当增大该参数的值。
’BlockSize’, 15:设置匹配时方块大小。
’ContrastThreshold’,0.5:对比度的阈值,阈值越大,错误匹配点越少,能匹配到的点也越少。
’UniquenessThreshold’,15:唯一性阈值,设置值越大,越破坏了像素的唯一性,设置为0,禁用该参数。
’DistanceThreshold’,400:从图像左侧到右侧检测的最大跨度,跨度越小越准确,但很容易造成无法匹配。禁用该参数[]。
’TextureThreshold’,0.0002(默认):最小纹理阈值,定义最小的可靠纹理,越大越造成匹配点少,越少越容易匹配到小纹理,引起误差。
返回的视差值,以图1为底板,以图2与图1的视差为灰度值
整体计算的步骤:
1.使用Sobel滤波器计算图像对比度的度量。
2.通过使用块匹配和绝对差值之和(SAD)来计算每个像素的视差。
3.标记包含不可靠的像素 差异值。该函数将像素设置为 - realmax(’ single’)返回的值。
%}
%显示 disparityMap
figure;imshow(disparityMap, [0, 400]);
title('Disparity Map');
colormap jet
colorbar
%% 从视差图中提取三维信息
%返回的矩阵 pointCloud3D为三维,(:,:,1)x坐标,(:,:,2)y坐标,(:,:,3)z坐标。
%返回的数类型为single,最好转化为double
pointCloud3D = reconstructScene(disparityMap, stereoParams);
pointCloud3D = double(pointCloud3D);
pointCloud3D = pointCloud3D/1000; %毫米转化为米
Z = double(pointCloud3D(:,:,3));
mask = repmat(Z> 5&Z <6,[1,1,3]);
J1(~mask)= 0;
%这里的50指定了显示的时候放大倍数为50%,也就是缩小一半放大。
%这里显示的是距离5~6米之间的物体,其他范围的物体都变成了黑色
figure;imshow(J1,'InitialMagnification',50);
%% Reconstruct the 3-D Scene形象显示深度信息
pointCloud3D = reconstructScene(disparityMap, stereoParams);
% Convert to meters and create a pointCloud object
pointCloud3D = pointCloud3D ./ 1000;
ptCloud = pointCloud(pointCloud3D, 'Color', J1);
% Create a streaming point cloud viewer
player3D = pcplayer([-3, 3], [-3, 3], [0, 8], 'VerticalAxis', 'y', ...
'VerticalAxisDir', 'down');
% Visualize the point cloud
view(player3D, ptCloud);
网友评论