• FPGA帧差算法实现图像识别跟踪,Verilog代码讲解全网最细,提供两套工程源码



    FPGA高端项目:FPGA帧差算法图像识别+目标跟踪,提供11套工程源码和技术支持

    1、前言

    本设计使用Xilinx和Altera系列FPGA实现帧差算法图像识别+目标跟踪,视频输入源由多种方案可供选择,既有廉价的OV5640、OV7725摄像头,也有高分辨率的HDMI输入,我使用了笔记本电脑充当HDMI输入源接入FPGA开发板;FPGA采集到输入视频后,首先使用本博常用的FDMA图像缓存架构将视频缓存到DDR3,作为“第一帧视频”的存放点;然后读出第一帧做RGB转灰度处理,得到的灰度图像再调用一路FDMA图像缓存架构进行缓存,作为“第二帧视频”的存放点;注意,前面说的“第一帧视频”和“第二帧视频”都是打了引号的,他指的是帧差算法的第一和第二帧;然后将两帧视频做帧差处理,得到帧差的视频,即得到了运动的目标视频;然后经过中值滤波、图像腐蚀、图像膨胀、图像画框等一系列操作,即得到了被框出来的运动的目标图像;然后经过HDMI发送模块,将视频输出显示器显示即可;提供vivado2019.1和Quartus 18.1版本的工程源码共计11套,详情见下表:
    在这里插入图片描述
    这里说明一下提供的11套工程源码的作用和价值,如下:

    工程源码1
    使用开发板的FPGA型号为Xilinx–Artix7–35T;输入源为ov5640摄像头,输入分辨率为1280x720@30Hz;经过帧差运动物体识别跟踪算法后,以HDMI接口输出,输出分辨率为1280x720@60Hz;HDMI编码方式为Sil9134芯片方案;适用于Xilinx–Artix7系列FPGA开发板使用;

    工程源码2
    使用开发板的FPGA型号为Xilinx–Artix7–35T;输入源为笔记本电脑模拟的HDMI视频,HDMI解码方式为Sil9011芯片方案,输入分辨率为1920x1080@60Hz;经过帧差运动物体识别跟踪算法后,以HDMI接口输出,输出分辨率1920x1080@60Hz;HDMI编码方式为Sil9134芯片方案;适用于Xilinx–Artix7系列FPGA开发板使用;

    工程源码3
    使用开发板的FPGA型号为Xilinx–Kintex7–325T;输入源为ov5640摄像头,输入分辨率为1280x720@30Hz;经过帧差运动物体识别跟踪算法后,以HDMI接口输出,输出分辨率为1280x720@60Hz;HDMI编码方式为纯verilog代码方案;适用于Xilinx–Kintex7系列FPGA开发板使用;

    工程源码4
    使用开发板的FPGA型号为Xilinx–Kintex7–325T;输入源为ov7725摄像头,输入分辨率为640x480@60Hz;经过帧差运动物体识别跟踪算法后,以HDMI接口输出,输出分辨率为640x480@60Hz;HDMI编码方式为纯verilog代码方案;适用于Xilinx–Kintex7系列FPGA开发板使用;

    工程源码5
    使用开发板的FPGA型号为Xilinx–Kintex7–325T;输入源为笔记本电脑模拟的HDMI视频,HDMI解码方式为IT6802芯片方案,输入分辨率为1920x1080@60Hz;经过帧差运动物体识别跟踪算法后,以HDMI接口输出,输出分辨率1920x1080@60Hz;HDMI编码方式为纯verilog代码方案;适用于Xilinx–Kintex7系列FPGA开发板使用;

    工程源码6
    使用开发板的FPGA型号为Xilinx–Zynq7020;输入源为ov5640摄像头,输入分辨率为1280x720@30Hz;经过帧差运动物体识别跟踪算法后,以HDMI接口输出,输出分辨率为1280x720@60Hz;HDMI编码方式为纯verilog代码方案;适用于Xilinx–Zynq7020系列FPGA开发板使用;

    工程源码7
    使用开发板的FPGA型号为Xilinx–Zynq7020;输入源为ov7725摄像头,输入分辨率为640x480@60Hz;经过帧差运动物体识别跟踪算法后,以HDMI接口输出,输出分辨率为640x480@60Hz;HDMI编码方式为纯verilog代码方案;适用于Xilinx–Zynq7020系列FPGA开发板使用;

    工程源码8
    使用开发板的FPGA型号为Xilinx–Zynq7010;输入源为ov5640摄像头,输入分辨率为1280x720@30Hz;经过帧差运动物体识别跟踪算法后,以HDMI接口输出,输出分辨率为1280x720@60Hz;HDMI编码方式为纯verilog代码方案;适用于Xilinx–Zynq7010系列FPGA开发板使用;

    工程源码9
    使用开发板的FPGA型号为Xilinx–Zynq7010;输入源为ov7725摄像头,输入分辨率为640x480@60Hz;经过帧差运动物体识别跟踪算法后,以HDMI接口输出,输出分辨率为640x480@60Hz;HDMI编码方式为纯verilog代码方案;适用于Xilinx–Zynq7010系列FPGA开发板使用;

    工程源码10
    使用开发板的FPGA型号为Altera–Cyclone IV;输入源为ov5640摄像头,输入分辨率为640x480@30Hz;经过帧差运动物体识别跟踪算法后,以LCD接口输出,输出分辨率为640x480@60Hz;LCD编码方式为纯verilog代码方案;适用于Altera–Cyclone IV系列FPGA开发板使用;

    工程源码11
    使用开发板的FPGA型号为Altera–Cyclone IV;输入源为ov5640摄像头,输入分辨率为640x480@30Hz;经过帧差运动物体识别跟踪算法后,以HDMI接口输出,输出分辨率为640x480@60Hz;HDMI编码方式为纯verilog代码方案;适用于Altera–Cyclone IV系列FPGA开发板使用;

    本文详细描述了Xilinx和Cyclone 系列FPGA帧差算法图像识别+目标跟踪,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
    提供完整的、跑通的工程源码和技术支持;
    工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

    免责声明

    本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。

    2、相关方案推荐

    FPGA帧差算法多个目标图像识别+目标跟踪

    本设计是Xilinx系列FPGA帧差算法实现单目标图像识别+目标跟踪,适用于跟踪单个运动目标,也有适用于跟踪多个目标的方案,即FPGA帧差算法多个目标图像识别+目标跟踪方案,该方案我之前专门推出过博客介绍,感兴趣的可以去看看,博客地址如下:
    点击直接前往

    3、详细设计方案

    设计原理框图

    工程源码设计原理框图如下:
    在这里插入图片描述

    运动目标检测原理

    运动目标检测原理:先将RGB图像转为灰度图只取亮度分量y,如果一个物体是运动的,那么前后两张或几张灰度图的同一位置的像素值应该是变化的,试想,如果是静止物体,比如一幅画,那么任意时刻,同一位置像素点的值不变才对,如果运动了,像素点的值自然也就改变了,很好理解,这个叫做帧差算法,这里的像素点差值有个范围,叫做阈值,cdn上有大佬说70~100是理想值。

    输入视频

    视频输入源由多种方案可供选择,既有廉价的OV5640、OV7725摄像头,也有高分辨率的HDMI输入,我使用了笔记本电脑充当HDMI输入源接入FPGA开发板;
    工程源码1、3、6、8使用OV5640摄像头,ov5640需要i2c配置才能使用,需要i2c配置分辨率,然后将DVP接口的两个时钟一个像素的GRB565视频数据采集为一个时钟一个像素的RGB565或者RGB888视频数据;ov5640i2c配置及采集代码如下:
    在这里插入图片描述
    工程源码4、7、9使用OV7725摄像头,OV7725需要i2c配置才能使用,需要i2c配置分辨率,然后将DVP接口的两个时钟一个像素的GRB565视频数据采集为一个时钟一个像素的RGB565或者RGB888视频数据;OV7725 i2c配置及采集代码如下:
    在这里插入图片描述
    工程源码2使用HDMI输入源,我使用了笔记本电脑充当HDMI输入源接入FPGA开发板,HDMI解码采用silcom9011芯片解码方案,silcom9011需要i2c配置才能使用,需要i2c配置分辨率,i2c配置及采集代码如下:
    在这里插入图片描述
    工程源码5使用HDMI输入源,我使用了笔记本电脑充当HDMI输入源接入FPGA开发板,HDMI解码采用IT6802芯片解码方案,IT6802需要i2c配置才能使用,需要i2c配置分辨率,i2c配置及采集代码如下:
    在这里插入图片描述

    图像缓存

    使用本博常用的FDMA图像缓存架构将视频缓存到DDR3,需要调用两路FDMA才能实现帧差算法,关于FDMA,请参考我之前的博客,博客地址:点击直接前往
    FDMA图像缓存架构在Block Design中如下:
    在这里插入图片描述

    RGB转灰度

    图像RGB转灰度的目的是做帧差算法,因为灰度图像只有8位,可以减少帧差的计算量,RGB转灰度代码如下:
    在这里插入图片描述

    帧差算法

    利用图像缓存模块得到间隔的两帧图像,根据两帧图输入进来的Y分量,在图像有效信号de期间,用后一帧图像的Y分量减去前一帧图像的Y分量得到差值,用差值与帧差阈值进行比较得到帧差标志,判定为是运动迹象,根据帧差标志将认定为是有变化的像素点赋白色像素值,其余赋黑色像素点,如此一来,得到的图像就是只有黑白像素的图像,其中由运动迹象的点是白色,其余是黑色,这就为后面的画框做好了铺垫;帧差算法代码如下:
    在这里插入图片描述
    1、帧差间隔,也就是2帧图像之间的时间间隔怎么选取?经验告诉我们选择5帧,代码部分如下:
    在这里插入图片描述
    2、帧差阈值,也就是两帧图像的Y分量之差是多少才能判定为是运动迹象呢?经验告诉我们选择20到100,但70为最佳,设计中采用了一个VIO来动态配置阈值,默认为70,如下:
    在这里插入图片描述

    中值滤波

    中值滤波采用2个fifo取3x3的算子模块,然后进行中值滤波,也就是以你某个像素点为中心,与其周边3个点的值取平均值,目的是为了使我们前面得到的黑白图像中的白色噪点减少;中值滤波法代码如下:
    在这里插入图片描述

    图像腐蚀和膨胀

    与中值滤波类似,同样采用2个fifo取3x3的算子模块,目的是为了使我们前面得到的黑白图像中的白色噪点进一步减少;图像腐蚀和膨胀代码如下:
    在这里插入图片描述

    运动目标图像画框

    这个模块是整个工程的精髓和难点所在,目的是把运动的二物体框出来;现解析如下:
    输入:处理后的黑白图像和原始的RGB图像,原始的RGB图像是图像缓存模块从ddr3中读出的图像,之所以要采用2个图像输入的方案,是为了输出的选择,如果判断当前像素点是运动迹象的边沿,则将该像素点赋为红色,否则赋原始的RGB图像的值;
    算法:算法部分只用黑白图像,判断黑白图像中白点的x轴坐标的最小位置和最大位置,以及y轴坐标的最小位置和最大位置,根据这四个点的坐标,就能框出一个矩形框,具体算法还得看代码,运动目标图像画框代码如下:
    在这里插入图片描述

    HDMI输出

    工程1、2的HDMI输出采用silcom9134芯片编码方案,将RGB视频编码为HDMI视频,silcom9134需要i2c配置才能使用,需要i2c配置分辨率,i2c配置及采集代码如下:
    在这里插入图片描述
    工程3、4、5、6、7、8、9的HDMI输出采用纯verilog代码编码方案,将RGB视频编码为HDMI视频,视频从FDMA读出后,经过VGA时序模块和HDMI发送模块后输出显示器,代码位置如下:
    在这里插入图片描述

    Xilinx系列FPGA工程源码架构

    Xilinx系列FPGA源码由两部分组成,一是Block Design搭建的基于FDMA实现的图像缓存架构,二是包含了Block Design的工程源码,以工程源码2为例,Block Design如下,其他几套与之类似:
    在这里插入图片描述
    以工程源码2为例,工程源码如下,其他几套与之类似:
    在这里插入图片描述
    工程源码6、7、8、9使用了自定义的FDMA方案,虽然不需要SDK配置,但FDMA的AXI4接口时钟由Zynq提供,所以需要运行SDK程序才能启动Zynq,从而为PL端逻辑提供时钟;由于不需要SDK配置,所以SDK软件代码就变得极度简单,只需运行一个“Hello World”即可,如下:
    在这里插入图片描述

    Altera系列FPGA工程源码架构

    Altera系列FPGA工程源码架构如下,以OV5640输入LCD显示屏输出工程为例,其他工程与之类似;
    在这里插入图片描述

    4、工程代码1详解–>OV5640输入,Xilinx Artix7版本

    开发板FPGA型号:Xilinx–Artix7–xc7a35tfgg484-2;
    开发环境:Vivado2019.1;
    输入:OV5640摄像头,分辨率1280x720;
    输出:HDMI,silcom9134编码,分辨率1280x720;
    工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
    工程Block Design和工程代码架构请参考第3章节《Xilinx系列FPGA工程源码架构》小节内容;
    工程的资源消耗和功耗如下:
    在这里插入图片描述

    5、工程代码2详解–>HDMI输入,Xilinx Artix7版本

    开发板FPGA型号:Xilinx–Artix7–xc7a35tfgg484-2;
    开发环境:Vivado2019.1;
    输入:HDMI–笔记本电脑模拟,silcom9011编码,分辨率1920x1080;
    输出:HDMI,silcom9134编码,分辨率1920x1080;
    工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
    工程Block Design和工程代码架构请参考第3章节《Xilinx系列FPGA工程源码架构》小节内容;
    工程的资源消耗和功耗如下:
    在这里插入图片描述

    6、工程代码3详解–>OV5640输入,Xilinx Kintex7版本

    开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
    开发环境:Vivado2019.1;
    输入:OV5640摄像头,分辨率1280x720;
    输出:HDMI,纯verilog代码编码,分辨率1280x720;
    工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
    工程Block Design和工程代码架构请参考第3章节《Xilinx系列FPGA工程源码架构》小节内容;
    工程的资源消耗和功耗如下:
    在这里插入图片描述

    7、工程代码4详解–>OV7725输入,Xilinx Kintex7版本

    开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
    开发环境:Vivado2019.1;
    输入:OV7725,分辨率640x480;
    输出:HDMI,纯verilog代码编码,分辨率640x480;
    工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
    工程Block Design和工程代码架构请参考第3章节《Xilinx系列FPGA工程源码架构》小节内容;
    工程的资源消耗和功耗如下:
    在这里插入图片描述

    8、工程代码5详解–>HDMI输入,Xilinx Kintex7版本

    开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
    开发环境:Vivado2019.1;
    输入:HDMI–笔记本电脑模拟,IT6802编码,分辨率1920x1080;
    输出:HDMI,纯verilog代码编码,分辨率1920x1080;
    工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
    工程Block Design和工程代码架构请参考第3章节《Xilinx系列FPGA工程源码架构》小节内容;
    工程的资源消耗和功耗如下:
    在这里插入图片描述

    9、工程代码6详解–>OV5640输入,Xilinx Zynq7020版本

    开发板FPGA型号:Xilinx–Zynq7020–xc7z020clg400-2;
    开发环境:Vivado2019.1;
    输入:OV5640摄像头,分辨率1280x720;
    输出:HDMI,纯verilog代码编码,分辨率1280x720;
    工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
    工程Block Design和工程代码架构请参考第3章节《Xilinx系列FPGA工程源码架构》小节内容;
    工程的资源消耗和功耗如下:
    在这里插入图片描述

    10、工程代码7详解–>OV7725输入,Xilinx Zynq7020版本

    开发板FPGA型号:Xilinx–Zynq7020–xc7z020clg400-2;
    开发环境:Vivado2019.1;
    输入:OV7725,分辨率640x480;
    输出:HDMI,纯verilog代码编码,分辨率640x480;
    工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
    工程Block Design和工程代码架构请参考第3章节《Xilinx系列FPGA工程源码架构》小节内容;
    工程的资源消耗和功耗如下:
    在这里插入图片描述

    11、工程代码8详解–>OV5640输入,Xilinx Zynq7010版本

    开发板FPGA型号:Xilinx–Zynq7010–xc7z010clg400-2;
    开发环境:Vivado2019.1;
    输入:OV5640摄像头,分辨率1280x720;
    输出:HDMI,纯verilog代码编码,分辨率1280x720;
    工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
    工程Block Design和工程代码架构请参考第3章节《Xilinx系列FPGA工程源码架构》小节内容;
    工程的资源消耗和功耗如下:
    在这里插入图片描述

    12、工程代码9详解–>OV7725输入,Xilinx Zynq7010版本

    开发板FPGA型号:Xilinx–Zynq7010–xc7z010clg400-2;
    开发环境:Vivado2019.1;
    输入:OV7725,分辨率640x480;
    输出:HDMI,纯verilog代码编码,分辨率640x480;
    工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
    工程Block Design和工程代码架构请参考第3章节《Xilinx系列FPGA工程源码架构》小节内容;
    工程的资源消耗和功耗如下:
    在这里插入图片描述

    13、工程代码10详解–>OV5640输入LCD输出,Altera Cyclone IV版本

    开发板FPGA型号:Altera–Cyclone IV–EP4CE6F17C8;
    开发环境:Quartus (Quartus Prime 18.1) ;
    输入:OV5640,分辨率640x480;
    输出:4.3寸显示屏,纯verilog代码编码,分辨率640x480;
    工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
    工程Block Design和工程代码架构请参考第3章节《Altera系列FPGA工程源码架构》小节内容;
    工程的资源消耗和功耗如下:
    在这里插入图片描述

    14、工程代码11详解–>OV5640输入HDMI输出,Altera Cyclone IV版本

    开发板FPGA型号:Altera–Cyclone IV–EP4CE6F17C8;
    开发环境:Quartus (Quartus Prime 18.1) ;
    输入:OV5640,分辨率640x480;
    输出:HDMI,纯verilog代码编码,分辨率640x480;
    工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
    工程Block Design和工程代码架构请参考第3章节《Altera系列FPGA工程源码架构》小节内容;
    工程的资源消耗和功耗如下:
    在这里插入图片描述

    15、工程移植说明

    vivado版本不一致处理

    1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;
    2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;
    在这里插入图片描述
    3:如果你的vivado版本高于本工程vivado版本,解决如下:
    在这里插入图片描述
    打开工程后会发现IP都被锁住了,如下:
    在这里插入图片描述
    此时需要升级IP,操作如下:
    在这里插入图片描述
    在这里插入图片描述

    FPGA型号不一致处理

    如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;

    其他注意事项

    1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;
    2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;
    3:纯FPGA移植到Zynq需要在工程中添加zynq软核;

    16、上板调试验证并演示

    准备工作

    需要如下器材设备:
    1、FPGA开发板;
    2、OV5640、OV7725摄像头或HDMI输入设备,比如笔记本电脑;
    2、HDMI连接线和显示器;

    OV5640输入版本工程演示

    工程1、3、6、8使用OV5640输入,分辨率为1280x720,帧差算法图像识别+目标跟踪输出效果如下:

    OV5640输入FPGA帧差算法图像识别+目标跟踪

    OV7725输入版本工程演示

    工程4、7、9使用OV7725输入,分辨率为640x480,帧差算法图像识别+目标跟踪输出效果如下:

    OV7725输入FPGA帧差算法图像识别+目标跟踪

    HDMI输入版本工程演示

    工程2、5使用HDMI输入,分辨率为1920x1080,帧差算法图像识别+目标跟踪输出效果如下:

    HDMI输入FPGA帧差算法图像识别+目标跟踪

    17、福利:工程源码获取

    福利:工程代码的获取
    代码太大,无法邮箱发送,以某度网盘链接方式发送,
    资料获取方式:私,或者文章末尾的V名片。
    网盘资料如下:
    在这里插入图片描述
    此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务:
    在这里插入图片描述

  • 相关阅读:
    C++文件和流
    嵌入式学习笔记(48)什么是I2C通信
    【微信小程序 | 实战开发】配置微信小程序APPID并快速接入
    Vue/React在页面展示JSON格式数据可拷贝可展开
    微服务下整合knife4j接口文档
    flink1.13.2 Streaming File Sink产生大量orc小文件的问题解决方案
    LabVIEW更改图像特定部分的颜色
    【项目实战】多租户实现数据库动态切换
    2242902-55-0_Desthiobiotin-phenol_脱硫生物素价格
    09.Tornado_获取请求参数
  • 原文地址:https://blog.csdn.net/qq_41667729/article/details/127686678