SAD算法,copy的SAD视觉匹配
(平行)双目立体视觉原理:
由相似三角型关系:
可得:
Z即深度
SAD:
从右图选定一个检测块,在左图中水平位置,从该位置向右检测n个块(步长1)(n为最大深度),找出灰度均值最接近的块,作为该块中心像素的深度。遍历整幅图像,可得到深度图。
code:
left=double(rgb2gray(imread('left.png')));
right=double(rgb2gray(imread('right.png')));
[m n]=size(left);
w=10; %窗口半径
depth=20; %最大偏移距离,同样也是最大深度距离
imgn=zeros(m,n);
for i=1+w:m-w
for j=1+w+depth:n-w
tmp=[];
lwin=left(i-w:i+w,j-w:j+w);
for k=0:-1:-depth
rwin=right(i-w:i+w,j-w+k:j+w+k);
diff=lwin-rwin;
tmp=[tmp sum(abs(diff(:)))];
end
[junk imgn(i,j)]=min(tmp); %获得最小位置的索引
end
end
imshow(imgn,[]);
结果反正不太行,不知道为啥所有的图匹配出来都是无规则像素块(再留个坑),不过原理是对的,就先这样吧,这副是比较好的结果:
导出3D点云数据,在MeshLab中渲染(稀碎)
matlab自带的函数,参见disparity
I1 = imread('left.jpg');
I2 = imread('right.jpg');
figure
imshow(stereoAnaglyph(I1,I2));
title('红蓝差异图');
disparityRange = [0 32];%差异范围,大-小=需要是16的整数倍
disparityMap = disparity(rgb2gray(I1),rgb2gray(I2),'BlockSize',...
15,'DisparityRange',disparityRange)
figure;
imshow(disparityMap,disparityRange);
title('填色');
colormap(gca,jet)
colorbar