zynq FPGA 的双目视觉毕业设计(七)之matlab实现立体匹配算法

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,直接将矫正的图片进行立体匹配。
在这里插入图片描述

欢迎关注我的公众号:芯王国,有更多的FPGA&数字IC的技术分享,还可以获取开源FPGA项目!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40377195/article/details/105031828