利用matlab实现双目测距
标定的图片
放一个网盘链接链接:https://pan.baidu.com/s/1Y1PLbCsdwMF370q0Jh-sJQ
提取码:5klj
里边是我用来进行双目标定的照片
具体标定我是使用MATLAB2020APP中的工具箱,关于matlab工具箱使用方法网上太多了,这里不再赘述。但是记得要保存标定得到的的数据哦~
重点:左右图片一定要同时拍,同时拍,同时拍哦!!!
如果没有条件同时拍两个相机,可以考虑使用录像的方法,先录视频,然后按帧截取。
具体测距代码
以下代码学习参考这篇博客(https://blog.csdn.net/a6333230/article/details/88245102)和mathworks官网(https://www.mathworks.com/help/vision/ref/reconstructscene.html)
废话不多说,直接上代码
I1 = imread('left017.jpg');%读取左右图片,我直接用标定的棋盘格照片测试的
I2 = imread('right017.jpg');
figure
imshowpair(I1, I2, 'montage');
title('Original Images');
%加载stereoParameters对象。
load('stereoParamsLittle.mat');%如果你没重命名,默认是stereoParams,这里我改名为stereoParamsLittle,注意这个文件名一共出现了3次,即加载一次,图像校正一次,三维重建一次。
[J1, J2] = rectifyStereoImages(I1, I2, stereoParamsLittle);
figure
imshowpair(J1, J2, 'montage');
title('Undistorted Images');
imwrite(J1,'畸变校正左.jpg');
imwrite(J2,'畸变校正右.jpg');
figure;
imshow(cat(3, J1(:,:,1), J2(:,:,2:3)), 'InitialMagnification', 50);%图像显示50%
disparityMap = disparitySGM(rgb2gray(J1),rgb2gray(J2));
figure
imshow(disparityMap,[0,64],'InitialMagnification',50);
xyzPoints = reconstructScene(disparityMap,stereoParamsLittle);
Z = xyzPoints(:,:,3);
mask = repmat(Z > 400 & Z < 550,[1,1,3]);%我测试的图片距离相机大概是40厘米-55厘米之间,所以我的Z的范围是400mm-500mm,大家根据实际情况写这个数据
J1(~mask) = 0;
figure
imshow(J1);
结果显示
第一次写博客,不足之处还请指正!