1.简述
通过对硕士论文的学习,明白立体匹配各个算法,现在用matlab是实现双目立体匹配。
论文学习链接:zynq FPGA 的双目视觉毕业设计(六)之硕士论文学习总结
2.源码
目前采用极线搜索,也就是只在水平方向进行搜索,误差比较大的。为了降低在FPGA上实现的难度,不打算采用多路径聚合,所以多路径的靠你们自己实现了。
这个源码只是匹配部分的,只需要将这部分算法添加到我前面的分享源码上,做个衔接就行。
传送门:zynq FPGA 的双目视觉毕业设计(五)之matlab 极线矫正算法实现
%Census
[B, A, C] = size(new_image_L)
windowsize = 9;
win = (windowsize -1)/2;
D_min = 0;
D_max = 50;
for b = win+1 : B-win
for a = win+1 : (A-win-D_max)
%左图census变换
var_r = zeros(1,windowsize^2);
parallax = D_min; hamm_data =10000; hamm=0;
for m = -win : 1 : win
for n = -win : 1: win
if(new_image_R(b+m,a+n) <= new_image_R(b,a))
var_r(1,9*n+m+41) = 1;
else
var_r(1,9*n+m+41) = 0;
end
end
end
%对右图进行变换
for d = D_min : 1 : D_max
var_l = zeros(1,windowsize^2);
hamm_value = 0;
for m = -win : 1 : win
for n = -win : 1: win
if(new_image_L(b+m,d+a+n) <= new_image_L(b,d+a))
var_l(1,9*n+m+41) = 1;
else
var_l(1,9*n+m+41) = 0;
end
end
end
%汉明距离计算
hamm = xor(var_l,var_r);
hamm_value = sum(hamm(:) == 1);
if(hamm_data > hamm_value)
hamm_data = hamm_value;
parallax = d;%得到视差值
end
end
parallax_image(b-win,a-win)= parallax;
end
end
dispMap = mat2gray(parallax_image);
B=medfilt2(dispMap,[5 5]);%中值滤波,滤波器窗口[9 9]
3.效果
效果不是很好,原因主要是只采用水平方向搜索匹配,误差很大。其次,极线矫正效果图可以看出矫正不是很好,这与标定板问题以及matlab标定问题,这个后面再做调整。还有就是用的标定图,不能突出物体距离,等新的板卡到了,采集一些图来测试一下。
说明:sobel算子提取图片边缘特征减少像素信息,也减少一些误差。也可以不用sobel,直接将矫正的图片进行立体匹配。