FPGA实现图像去雾 基于暗通道先验算法 纯verilog代码加速 提供3套工程源码和技术支持
1、前言
没玩过图像缩放和视频拼接都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。本文详细描述了FPGA实现图像去雾的实现设计方案,视频输入源有两种,一种是板载的HDMI输入接口,采用silicon9011芯片解码为RGB,另一种是廉价的ov5640摄像头;FPGA采集到输入视频后会进行图像去雾操作,图像去雾模块采用暗通道先验算法实现,利用verilog并行执行的特点对算法进行了加速;,再经过图像缓存后输出显示器,以验证图像去雾算法在FPGA中加速的正确性;提供3套vivado2019.1版本的工程源码,3套工程区别和详情如下:
vivado工程1:FPGA型号为Xilinx A7 xc7a35tfgg484-2,视频输入为HDMI,视频输出为HDMI;
vivado工程2:FPGA型号为Xilinx A7 xc7a35tfgg484-2,视频输入为ov5640,视频输出为HDMI;
vivado工程3:FPGA型号为Xilinx Zynq7020 xc7z020clg400-2,视频输入为ov5640,视频输出为HDMI;
工程代码编译通过后上板调试验证,文章末尾有演示视频,可直接项目移植,适用于在校学生、研究生,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后。
版本更新说明
此版本为第2版,根据读者的建议,对第1版工程做了如下改进和更新:
1:优化了FDMA缓存架构的源码;
2:新增了Zynq7020 版本工程;
免责声明
本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。
2、目前我这里已有的图像处理方案
目前我这里已有的图像处理方案有很多,包括图像缩放、图像拼接、图像旋转、图像识别跟踪、图像去雾等等,所有工程均在自己的板子上跑通验证过,保证代码的可靠性,对图像处理感兴趣或有项目需求的兄弟可以参考我的图像处理专栏,里面包含了上述工程源码的详细设计方案和验证视频演示:直接点击前往
3、暗通道先验算法介绍
暗通道先验算法介绍可以百度一下或者csdn或者知乎搜一下看看,专业的讲解我不擅长,我只擅长用fpga实现算法,专业讲原理的大佬比我讲得好,这里可以推荐一篇阅读量很大的文章:直接点击前往
4、本图像去雾模块的优缺点
优点1:纯verilog代码实现,无任何IP,可在xilinx、altera、国产FPGA等平台间自由移植;
优点2:算法加速,利用了FPGA并行计算的特点;
优点3:提供了2套工程源码,对接不同的视频输入接口;
缺点1:算法还不够完美,去雾效果也不完美,个人觉得;待我优化;
缺点2:用于验证、学习、课题等可以,做实际产品还不理想;
缺点3:对输入的图像要求稍微有点高,那种色差太过严重的去雾效果不好,我测试的这个视频作为输入源去雾效果是可以的的,兄弟们可以把这个视频作为输入源:点击查看来源
5、详细设计方案
本文详细描述了FPGA实现图像去雾的实现设计方案,视频输入源有两种,一种是板载的HDMI输入接口,采用silicon9011芯片解码为RGB,另一种是廉价的ov5640摄像头;FPGA采集到输入视频后会进行图像去雾操作,图像去雾模块采用暗通道先验算法实现,利用verilog并行执行的特点对算法进行了加速;,再经过图像缓存后输出显示器,以验证图像去雾算法在FPGA中加速的正确性;设计框图如下:
视频输入
vivado工程1的视频输入为HDMI,使用笔记本电脑模拟视频源,即将笔记本电脑通过HDMI线连接到FPGA开发板的HDMI输入接口,输入视频分辨率为1920x1080@60Hz,HDMI视频解码方式为silicon9011芯片解码,即silicon9011将输入的HDMI视频解码为RGB视频供FPGA使用,silicon9011芯片需要i2c配置才能使用,请参考我之前关于silicon9011和silicon9134芯片驱动的详细讲解:直接点击前往
vivado工程2的视频输入为ov5640,DVP接口,输入视频分辨率为1280x720@30Hz;
vivado工程3的视频输入为ov5640,DVP接口,输入视频分辨率为1280x720@30Hz;
图像去雾
图像去雾模块由纯verilog代码实现,采用暗通道先验算法理论,由3个模块顺序执行,3个模块内部并行执行,实现了FPGA加速算法的目的,分别由求RGB最小值模块、求折射率模块、图像去雾组成;
求RGB最小值的目的是实时的比较求出每个像素点RGB分量的最小值,也就是暗通道,该模块顶层接口如下:
求折射率的目的是输出暗通道最大值和折射率,该模块顶层接口如下:
该模块有个i_thre输入接口,该接口为阈值,初始值为26,vivado工程1和vivado工程2通过外接串口动态控制,vivado工程3通过VIO动态控制;
图像去雾的目的是输出暗通道最大值和折射率,该模块顶层接口如下:
三个模块整合封装后的图像去雾模块接口如下:
图像缓存
vivado工程1和vivado工程2采用FDMA图像缓存架构实现图像缓存,即将图像写入DDR3种缓存三帧后再读出来,FDMA图像缓存架构详情,请参考我之前关于FDMA的详细讲解:直接点击前往
串口解析
vivado工程1和vivado工程2用外接串口动态控制图像去雾模块的参数,串口采用数据帧的方式发送和解析,这我常用的板间通信控制方案,详情请参考我之前关于串口解析的详细讲解:直接点击前往
串口解析模块的作用是用电脑发送命令控制图像去雾模块的输入阈值,这个阈值的初始值为十进制26,如果你在使用过程中觉得图像去雾效果不好,可以将这个阈值调大或者调小,我这里通过串口调试助手设置了多种阈值进行调整,如下:
比如要发送阈值为26,则发送控制命令如下:
aa bb 00 00 00 1a 1a cc dd;
要发送阈值为251,则发送控制命令如下:
aa bb 00 00 00 fb fb cc dd;
视频输出
vivado工程1的视频输出为HDMI,输出视频分辨率为1920x1080@60Hz,HDMI视频编码方式为silicon9134芯片解码,即silicon9134将输入的RGB视频编码为HDMI视频输出,silicon9134芯片需要i2c配置才能使用,请参考我之前关于silicon9011和silicon9134芯片驱动的详细讲解:直接点击前往
vivado工程2的视频输出为HDMI,输出视频分辨率为1920x1080@60Hz,HDMI视频编码方式为silicon9134芯片解码;
vivado工程3的视频输出为HDMI,HDMI视频编码方式为纯verilog代码实现的HDMI输出模块,输出视频分辨率为1280x720@60Hz;
6、vivado工程1详解
开发板FPGA型号:Xilinx Artix7 xc7a35tfgg484-2;
开发环境:vivado2019.1;
输入:HDMI,分辨率1920x1080@60Hz;
输出:HDMI,分辨率1920x1080@60Hz;
工程Block Design如下:
工程代码架构如下:
FPGA资源消耗和功耗预估如下:
7、vivado工程2详解
开发板FPGA型号:Xilinx Artix7 xc7a35tfgg484-2;
开发环境:vivado2019.1;
输入:ov5640摄像头,分辨率1280x720@30Hz;
输出:HDMI,分辨率1920x1080@60Hz;
工程Block Design如下:
工程代码架构如下:
FPGA资源消耗和功耗预估如下:
8、vivado工程3详解
开发板FPGA型号:Xilinx Zynq7020 xc7z020clg400-2;
开发环境:vivado2019.1;
输入:ov5640摄像头,分辨率1280x720@30Hz;
输出:HDMI,分辨率1280x720@30Hz;
工程Block Design如下:
工程代码架构如下:
FPGA资源消耗和功耗预估如下:
SDK软件工程代码架构如下:
SDK软件主函数代码如下:
#include "I2C_16bit.h"
#include "xiicps.h"
#include "xil_io.h"
#include "xparameters.h"
#include "helai_vdma.h"
#include "xscugic.h"
#define VDMA0_BASEADDR XPAR_AXI_VDMA_0_BASEADDR
#define VIDEO0_BASEADDR0 0x01000000
#define VIDEO0_BASEADDR1 0x02000000
#define VIDEO0_BASEADDR2 0x03000000
#define H_ACTIVE 1280
#define V_ACTIVE 720
#define H_STRIDE 1280
XIicPs Iic;
XScuGic Intc; //中断控制器驱动程序实例
void main()
{
I2C_config_init(); //ov5640 配置完成
helai_vdma(VDMA0_BASEADDR,VIDEO0_BASEADDR0,VIDEO0_BASEADDR1,VIDEO0_BASEADDR2,H_ACTIVE,V_ACTIVE,H_STRIDE); // VDMA1 配置完成
while (1) ;
}
9、工程移植说明
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软核;
10、上板调试验证
这里仅以vivado工程1做输出演示:
静态展示:
动态视频演示:
图像去雾文章来源:https://www.toymoban.com/news/detail-429069.html
测试视频中的原始带雾视频来源: 点击查看来源
11、福利:工程源码获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送;
资料如下:获取方式:私,或者文章结尾的V名片;
三套vivado工程中图像去雾模块源码位置分别如下:
文章来源地址https://www.toymoban.com/news/detail-429069.html
到了这里,关于FPGA实现图像去雾 基于暗通道先验算法 纯verilog代码加速 提供2套工程源码和技术支持的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!