基于FPGA的双目视觉教程_4.汉明距离到代价空间

项目框架

本项目使用的开发板为zynq7020,框架为正点原子提供的hdim显示双目摄像头例程,
并在此基础上进行双目视觉处理,最终生成视差图和深度图; 所有双目视觉处理部分均在pl端采用Verilog实现
在这里插入图片描述

视差缓存

在左右图像的census计算完成之后会获得左目的5*5的windows窗口

input   [24:0] data_in_L,//WIndows
 input   [24:0] data_in_R,//WIndows

在获取到窗口后需要定义一个最大视差范围,这里我选择的是64,并且以左目相机为基准计算代价空间,这就需要对右目数据进行缓存,共需要缓存64个Windows,我这里直接选择用寄存器缓存

 //============= 缓存 视差范围内的census向量 以便并行处理========================
    integer i;
    reg [24:0] census_array_L [0:`MAX_DISP-1];
    reg [24:0] census_array_R [0:`MAX_DISP-1];
    
    always@(posedge clk,negedge rst_n)begin
        if(~rst_n)begin
            for (i=0;i<`MAX_DISP;i=i+1)begin
                census_array_L[i]<=0;
                census_array_R[i]<=0;
            end
        end
        else if(data_in_L_valid)begin  
            census_array_R[0]<=data_in_R;                              //第一拍
            census_array_L[0]<=data_in_L;
            for (i=1;i<`MAX_DISP;i=i+1)begin
                census_array_R[i]<=census_array_R[i-1];//右图保存64个census用于和左图计算汉明距离
            end
        end    
    end

异或运算得到汉明距离

再进行完右目数据缓存之后在进行异或计算,FPGA可以实现左目当前数据和右目缓存的64个数据同时进行异或运算,代码如下:

    //============== 并行异或运算 MAX_DISP=> 1 ======================
    wire [24:0] now_census_L ;
    reg  [24:0] hamming_distance_vec[0:`MAX_DISP-1];
    assign now_census_L =  census_array_L[0];//左图为主为census_array_L[0];右图为主为census_array_L[`MAX_DISP-1]
    always@(posedge clk,negedge rst_n)begin
       if(~rst_n)begin
            for (i=0;i<`MAX_DISP;i=i+1)begin
                hamming_distance_vec[i]<=0;
            end
       end
       else begin
            for (i=0;i<`MAX_DISP;i=i+1)begin
            	//现在左边像素点的cesusu与右边的像素点的(64-census~census)64个像素点进行异或运算
                    hamming_distance_vec[i]<=now_census_L ^ census_array_R[i];// hamming_distance_vec[i]==5*5  //第二拍  汉明距离的计算从右向左
            end
       end
    end

在进行完异或运算之后便会等到一个64个数据的 hamming_distance_vec[]数组,每个数据为24位,将数组每个数据的24位逐个累加便得到了汉明距离数组,其代码如下

    integer disp_index,add_index;
    always@(posedge clk)begin
        //===== add0 ====== //第三拍
        for(disp_index=0;disp_index<`MAX_DISP;disp_index=disp_index+1)begin//视差方向
            for(add_index=0;add_index<12;add_index=add_index+1)begin //组内加法
                add0[disp_index][add_index]<=hamming_distance_vec[disp_index][add_index*2]+hamming_distance_vec[disp_index][add_index*2+1];
            end
                add0[disp_index][12] <= hamming_distance_vec[disp_index][24];
        end 
        //===== add1 ======  //第四拍
        for(disp_index=0;disp_index<`MAX_DISP;disp_index=disp_index+1)begin//视差方向
            for(add_index=0;add_index<6;add_index=add_index+1)begin //组内加法
                add1[disp_index][add_index]<=add0[disp_index][add_index*2]+add0[disp_index][add_index*2+1];
            end
                add1[disp_index][6] <= add0[disp_index][12];
        end
        //===== add2 ======  //第五拍
        for(disp_index=0;disp_index<`MAX_DISP;disp_index=disp_index+1)begin//视差方向
            for(add_index=0;add_index<3;add_index=add_index+1)begin //组内加法
                add2[disp_index][add_index]<=add1[disp_index][add_index*2]+add1[disp_index][add_index*2+1];
            end
                add2[disp_index][3] <= add1[disp_index][6];
        end
         //===== add3 ====== //第六拍
        for(disp_index=0;disp_index<`MAX_DISP;disp_index=disp_index+1)begin//视差方向
            for(add_index=0;add_index<2;add_index=add_index+1)begin //组内加法
                add3[disp_index][add_index]<=add2[disp_index][add_index*2]+add2[disp_index][add_index*2+1];
            end
        end
          //===== add4 ====== //第七拍
        for(disp_index=0;disp_index<`MAX_DISP;disp_index=disp_index+1)begin//视差方向
           add4[disp_index]<=add3[disp_index][0]+add3[disp_index][1];
        end
    end  

视差计算

在得到汉明距离后只需在所表示汉明距离的数组中找出最小值所在的数组下标索引便可以得出初步视差图,具体效果如下左右目图像
在这里插入图片描述
这是根据左右目图像算出的 初步视差图,后续还需要进行SGM聚合,SGM聚合之后的效果为:
在这里插入图片描述
可以看到效果有明显的改善.

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: TCP/IP协议栈被广泛应用于互联网的网络通信系统中,是现代计算机网络的核心协议。而FPGA作为一种可编程逻辑器件,其性能优越、可靠性高、可重构性强等特点使得它成为TCP/IP协议栈的一种较为理想的实现方式。 而基于FPGA的TCP协议栈设计中,Verilog语言是一种常用的设计语言。Verilog语言支持提供高级综合功能,可以使TCP协议栈的设计更加高效和精确。因此,基于Verilog实现TCP/IP协议栈是可以实现较高性能和灵活性的。 tcpip_stack_v1_2.zip是一种基于FPGA Verilog的TCP/IP协议栈。该协议栈是通过Verilog语言进行开发设计的,使得其可移植性、可重用性、可拓展性等优势更加突出。该协议栈具有良好的性能和稳定性,其采用了先进的计算机网络技术,可以实现高效可靠的数据传输。 基于FPGA Verilog的TCP协议栈对于网络通讯领域具有广泛的应用前景,尤其在工业控制系统和网络安全等领域。随着计算机网络技术的发展,TCP/IP协议栈的重要性将愈来愈大,而基于FPGA Verilog的TCP/IP协议栈也将成为其重要的实现方式。 ### 回答2: tcpip_stack_v1_2.zip是一个基于FPGA Verilog的TCP/IP协议栈。它是一个开源项目,可以在GitHub上找到。该协议栈实现了TCP/IP协议,可以用于网络通信,包括基于以太网和Wi-Fi的无线网络。 该协议栈是使用Verilog HDL编写的,可以在FPGA芯片上实现。它提供了TCP和IP协议中的所有基本功能,包括数据包的发送和接收,分组重组,以及错误检测和校验等。此外它还支持DHCP、ARP、ICMP、UDP等协议。 使用该协议栈可以极大地简化网络应用的开发难度,使用者只需要将该协议栈集成到自己的系统中即可。该协议栈使用简单,经过了广泛的测试和验证,保证了数据的安全和可靠性。 总的来说,tcpip_stack_v1_2.zip是一个高质量、稳定、功能完备的基于FPGA Verilog的TCP/IP协议栈。它为网络通信提供了有效的解决方案,可以方便地用于各种应用场合。 ### 回答3: TCP/IP(Transmission Control Protocol/Internet Protocol)是一组网络协议,用于在互联网上进行通信和数据传输。在这个过程中,TCP负责数据的分段、传输控制和重传;而IP负责数据包的路由和转发。 FPGA(Field Programmable Gate Array)是一种可重构硬件平台,可以根据需要进行编程和修改,实现特定的硬件功能。Verilog是一种硬件描述语言,用于对FPGA进行描述和编程。 TCP/IP stack v1.2.zip是基于FPGA Verilog实现的TCP/IP协议栈,它可以在FPGA上运行。它实现了TCP/IP协议栈的所有功能,包括TCP和IP协议的实现,网络数据包的分段、传输和重传,以及数据包的路由和转发。 这个TCP/IP stack可以被用于各种应用,比如互联网接入、网络通信、数据传输等等。它采用Verilog硬件描述语言编写,并且可以在FPGA上进行编程和修改,以实现特定的硬件功能。使用FPGA实现TCP/IP协议栈可以提高性能、降低延迟,并且可以实现特定的硬件优化和功能扩展。 综上所述,基于FPGA Verilog的TCP/IP stack v1.2.zip是一个实现了TCP/IP协议栈的硬件模块,它可以被用于各种应用,提高性能、降低延迟,并且可以实现特定的硬件优化和功能扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式学习~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值