紫光同创FPGA实现图像去雾 基于暗通道先验算法 纯verilog代码加速 提供2套工程源码和技术支持

news2024/12/28 4:57:55

目录

  • 1、前言
    • 免责声明
    • 本去雾模块的特点
  • 2、目前我这里已有的图像处理方案
  • 3、设计思路框架
    • SD卡初始化
    • SD卡读操作
    • SD卡读图片
    • OV5640摄像头配置及采集
    • HDMA图像缓存
      • 输入输出视频
      • HDMA缓冲FIFO
      • HDMA控制模块
    • 图像去雾模块详解
    • HDMI输出
  • 4、PDS工程1详解:SD卡提供有雾图片
  • 5、PDS工程2详解:OV5640输入
  • 6、上板调试验证并演示
    • 准备工作
    • SD卡制作
    • 静态演示
    • 动态演示
  • 7、福利:工程源码获取

紫光同创FPGA实现图像去雾 基于暗通道先验算法 纯verilog代码加速 提供2套工程源码和技术支持

1、前言

2019年初我刚出道时,还是Xilinx遥遥领先的时代(现在貌似也是),那时的国产FPGA还处于黑铁段位,国产FPGA仰望Xilinx情不自禁道:你以为躲在这里就找不到你吗?没用的,你那样拉轰的男人,无论在哪里,都像黑夜里的发光虫那样的鲜明、那样的出众,你那忧郁的眼神,稀嘘的胡渣子,神乎其技的刀法,还有那杯Dry martine,都深深的迷住了我。。。然而才短短4年,如今的国产FPGA属于百家争鸣、百花齐放、八仙过海、神仙打架、方兴未艾、得陇望蜀、友商都是XX的喜极而泣之局面,面对此情此景,不得不吟唱老人家的诗句:魏武挥鞭,东临碣石有遗篇,萧瑟秋风今又是,换了人间。。。
言归正传,目前对于国产FPGA的共识有以下几点:
1:性价比高,与同级别国外大厂芯片相比,价格相差几倍甚至十几倍;
2:自主可控,国产FPGA拥有完整自主知识产权的产业链,从芯片到相关EDA工具
3:响应迅速,FAE技术支持比较到位,及时解决开发过程中遇到的问题,毕竟中文数据手册。。
4:采购方便,产业链自主可控,采购便捷

没玩过图像处理都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。本文使用紫光同创的PGL22G-6MBG324 FPGA实现暗通道先验算法图像去雾,输入视频采用静态图片或者OV5640摄像头模组,所以提供2套PDS工程源码,第一套采用SD卡提供静态图片作为视频输入,第二套采用OV5640摄像头作为视频输入;FPGA采集到视频数据后,首先将视频送入DDR3中做乒乓缓存后读出,然后视频经过图像去雾模块处理后送入HDMI输出模块,最后送显示器输出显示;

本博客详细描述了紫光同创FPGA实现图像去雾的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;

提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

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

本去雾模块的特点

1:纯verilog代码实现,模块本身可在各种FPGA间自由移植;
2:采用基于暗通道先验算法实现,理论较为成熟;
3:本模块目前并不完善,还存在BUG,对输入视频或图像要求较高,所以我提供一个处理效果较好的视频源和图片给大家,其他视频源或图片不能保证能很好地去雾,推荐的视频源链接如下:
直接点击前往
4:模块还在持续优化中,会实时更新。。。

2、目前我这里已有的图像处理方案

目前我这里已有的图像处理方案有很多,包括图像缩放、图像拼接、图像旋转、图像识别跟踪、图像去雾等等,所有工程均在自己的板子上跑通验证过,保证代码的可靠性,对图像处理感兴趣或有项目需求的兄弟可以参考我的图像处理专栏,里面包含了上述工程源码的详细设计方案和验证视频演示:直接点击前往

3、设计思路框架

本文使用紫光同创的PGL22G-6MBG324 FPGA实现暗通道先验算法图像去雾,输入视频采用静态图片或者OV5640摄像头模组,所以提供2套PDS工程源码,第一套采用SD卡提供静态图片作为视频输入,第二套采用OV5640摄像头作为视频输入;FPGA采集到视频数据后,首先将视频送入DDR3中做乒乓缓存后读出,然后视频经过图像去雾模块处理后送入HDMI输出模块,最后送显示器输出显示;
第一套PDS工程设计思路框架如下:
在这里插入图片描述
第二套PDS工程设计思路框架如下:
在这里插入图片描述

SD卡初始化

第一套工程使用了此模块,SD 卡初始化模块完成对SD卡的上电初始化操作,严格按照SD卡初始化流程写出上电时序,采用三段式状态机方式实现,代码位置如下:
在这里插入图片描述
由于这部分代码很简单,所以不过多描述,可自行百度SD卡初始化流程时序;

SD卡读操作

第一套工程使用了此模块,作用是根据SD卡读时序对其进行读数据操作,代码位置如下:
在这里插入图片描述
由于这部分代码很简单,所以不过多描述,可自行百度SD卡读时序;

SD卡读图片

第一套工程使用了此模块,作用是将图片从SD卡里读出来,代码位置如下:
在这里插入图片描述
这个模块很重要,他直接关系到能否正确读出图片,里面有两个参数很重要,可能需要修改,如下:
在这里插入图片描述
这两个参数是2张图片在SD卡中的扇区地址,由于不同的图片在SD卡中的扇区地址可能不同,所以这两个参数需要根据你的实际情况来修改,那么SD卡中图片的扇区地址如何查看呢?使用我提供的WinHex工具查看,WinHex软件在提供的压缩资料包里面,方法如下:
在这里插入图片描述
注意:如果提示缺少管理员权限,是否重新程序 WinHex,选择“是”,然后重新选择“打开磁盘”。
在这里插入图片描述
在“物理驱动器”下,我们看到上图标记位 2 的地方有 RM2、Generic STORAGE DEVICE(14.8GB,USB)的字样,该物理驱动器对应的是 TF 卡,标号为 RM2,我们找到标号 RM2 在逻辑驱动器中的位置即箭头 1 所指的地方,选中后点击“确定”按钮即可查看文件的起始扇区地址,打开后的界面如下图所示:
在这里插入图片描述
在这里插入图片描述
可以看到:
第一张图片的物理扇区地址为22122;
第二张图片的物理扇区地址为16672;
与我们SD卡读图片模块的配置地址一致,如下:
在这里插入图片描述

OV5640摄像头配置及采集

第二套工程使用了此模块,OV5640摄像头需要i2c配置才能使用,需要将DVP接口的视频数据采集为RGB565或者RGB888格式的视频数据,这两部分均用verilog代码模块实现,代码位置如下:
在这里插入图片描述
其中摄像头配置为分辨率1280x720,如下:
在这里插入图片描述
摄像头采集模块支持RGB565和RGB888格式的视频输出,可由参数配置,如下:
在这里插入图片描述
RGB_TYPE=0输出本RGB565格式;
RGB_TYPE=1输出本RGB888格式;
本设计使用RGB888格式;

HDMA图像缓存

工程一和工程二均用到了此模块,HDMA图像缓存的本质就是一个封装了用户接口的AXI4-FULL-MASTER总线,HDMA对外与DDR3交互,紫光同创FPGA自带的DDR3控制器的用户接口为AXI4-FULL总线,HDMA对内例化两个FIFO与FPGA内部逻辑交互,所以开发者在使用HDMA时,已无需再关心复杂的为AXI4-FULL协议,只需要像使用FIFO那样简单即可;HDMA架构如下:
在这里插入图片描述
代码架构如下:
在这里插入图片描述

输入输出视频

输入视频的数据格式为RGB,即典型的pclk、vs、de、rgb形式的VGA视频时序,但需要注意的是,因为输入视频直接与FIFO交互,FIFO的AXI侧的数据位宽为128位,为了数据的不错位,输入视频的rgb信号接口不能为传统的24位,这里可以设置为16或者32位,代码中通过参数配置,我配置为32位,如下:
在这里插入图片描述

HDMA缓冲FIFO

例化两个FIFO作为FPGA逻辑数据与AXI4数据的缓冲,所谓缓冲,即数据位宽的转换、时钟域的转换、读写时机的控制等部分,FPGA逻辑侧的数据位宽为32位,AXI4侧的数据位宽为128位;以写FIFO为例,配置如下:
在这里插入图片描述

HDMA控制模块

HDMA控制模块的主要功能是实现AXI4-FULL主机和图像缓存读写地址切换两大功能;AXI4-FULL主机比较简单,照着AXI4-FULL时序图写就完事儿了,图像缓存读写地址切换就难了,本设计通过顶层的参数来配置图像缓存的帧数,如下:
HDMA_PINGPANG_EN=1则图像做三帧缓存;
HDMA_PINGPANG_EN=0则图像做单帧缓存;
本设计配置为HDMA_PINGPANG_EN=1;
为了实现图像的多帧缓存,将读写地址分段,如下:
读写地址=帧地址+数据地址;
数据地址:即正常的AXI4数据突发的地址增量;
写帧地址:一帧图像到来时+1;
读帧地址:一帧图像到来时+2;
如此做到了同时读写不同的帧地址,输出的图像是完美的。。。
这也叫做乒乓操作,核心代码如下:
在这里插入图片描述

图像去雾模块详解

暗通道先验-图像去雾由3个模块顺序执行,3个模块内部并行执行,实现了FPGA加速算法的目的,分别由求RGB最小值和求折射率以及图像去雾组成,框图如下:
在这里插入图片描述
求RGB最小值的目的是实时的比较求出每个像素点RGB分量的最小值,也就是暗通道,该模块顶层接口如下:
在这里插入图片描述
求折射率的目的是输出暗通道最大值和折射率,该模块顶层接口如下:
在这里插入图片描述
图像去雾的目的是输出暗通道最大值和折射率,该模块顶层接口如下:
在这里插入图片描述
三个模块整合封装后的图像去雾模块接口如下:
在这里插入图片描述

HDMI输出

HDMI输出包括VGA时序和HDMI编码模块,VGA时序在紫光PGL22G-6MBG324 FPGA上只能做到720P,因为此FPGA可能太低端了,无法输出742.5M的串行时钟,当然,你用HDMI编码芯片是可以实现1080P的,所以这里只能做到720P的输出分辨率;HDMI编码模块待用原语实现,和Xilinx家的一样,代码结构如下:
在这里插入图片描述

4、PDS工程1详解:SD卡提供有雾图片

开发板FPGA型号:紫光同创–PGL22G-6MBG324;
开发环境:Pango Design Suite 2021.4
输入:SD卡里的有雾图片,分辨率1280x720;
输出:HDMI,分辨率1280x720;
工程作用:紫光同创FPGA实现图像去雾;
工程代码架构如下:
在这里插入图片描述
工程的资源消耗和功耗如下:
在这里插入图片描述
工程已经综合编译完成,如下:
在这里插入图片描述

5、PDS工程2详解:OV5640输入

开发板FPGA型号:紫光同创–PGL22G-6MBG324;
开发环境:Pango Design Suite 2021.4
输入:OV5640输入,分辨率1280x720;
输出:HDMI,分辨率1280x720;
工程作用:紫光同创FPGA实现图像去雾;
工程代码架构如下:
在这里插入图片描述
工程的资源消耗和功耗如下:
在这里插入图片描述
工程已经综合编译完成,如下:
在这里插入图片描述

6、上板调试验证并演示

准备工作

你需要有以下装备才能移植并测试该工程代码:
1:FPGA开发板;
2:SD卡或OV5640摄像头,如果没有也可以,就选择动态彩条;
3:HDMI传输线;
4:HDMI显示,要求分辨率支持1280x720;

SD卡制作

准备一张SD卡,两张一模一样的带有雾气的图片,图片需要旋转180°,我已准备好并放在了资料包里,将SD卡格式化,然后将图片复制粘贴进去,再用WinHex软件查看两张图片的物理扇区地址,并在SD卡读图片模块中修改扇区地址的值,详情参考前面的SD卡读图片章节;我提供的有雾图片在资料包的路径如下:
在这里插入图片描述

静态演示

工程1:SD卡读取图片输入1280x720分辨率图像去雾后HDMI输出静态演示如下:
原始有雾图像:
在这里插入图片描述
图像去雾处理后的输出图像如下:
在这里插入图片描述
工程2:ov5640摄像头输入1280x720分辨率图像去雾后HDMI输出静态演示如下:
在这里插入图片描述

动态演示

仅以工程2的OV5640输入的动态视频演示如下:

紫光-图像去雾

7、福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用“qwer”打造类似梦幻西游中比巧克力还丝滑的状态机

点击上方亿元程序员关注和★星标 引言 大家好,我是亿元程序员,一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》,让糟糕的代码在潜移默化中升华,欢迎大家关注分享收藏订阅。 梦幻西游是流量密码吗&…

Trace 在多线程异步体系下传递最佳实践

JAVA 线程异步常见的实现方式有&#xff1a; new ThreadExecutorService 当然还有其他的&#xff0c;比如fork-join&#xff0c;这些下文会有提及&#xff0c;下面主要针对这两种场景结合 DDTrace 和 Springboot 下进行实践。 引入 DDTrace sdk <properties><java.…

Sui特性将推动下一波游戏大发展

随着游戏行业的竞争日益激烈&#xff0c;区块链技术为游戏工作室提供了必要的优势&#xff0c;以保持观众对他们的兴趣。实际上&#xff0c;区块链技术可能是未来游戏设计中最令人愉快和吸引人的关键。游戏在深入探索世界方面表现很棒&#xff0c;它们通过视觉、叙事和社区建设…

Scala入门到放弃—02—函数

文章目录 函数方法定义默认参数命名参数可变参数条件语句循环表达式 函数 方法定义 def 方法名(参数: 参数类型): 返回值类型 {//方法体//最后一行作为返回值(不需要使用return) } def max(x: Int, y: Int): Int {if(x > y)xelse y }package org.example object App {de…

C++ 模板的编译链接讨论

//头文件 #ifndef Test_h__ #define Test_h__ template<class T> class Test1 { public: static T Add(const T& x, const T& y); }; #endif // Test_h__ //cpp文件 #include "Test.h" template<class T> T Test1<T>::Add(const …

Qt 案例 使用QNetworkReply或者URLDownloadToFile 下载http、https资源到本地路径

Qt 使用QNetworkReply或者URLDownloadToFile两种不同方式下载http、https链接资源文件&#xff0c;并且获取下载进度。 目录 一、 使用 URLDownloadToFile 下载二、 使用 QNetworkReply 下载三、 打包好的可执行程序示例下载四、 会员或订阅专栏下载源码 一、 使用 URLDownload…

USB协议学习(二)设备枚举过程分析

USB协议学习&#xff08;二&#xff09;设备枚举过程分析 笔者来聊聊设备枚举过程分析. 这里写自定义目录标题 USB协议学习&#xff08;二&#xff09;设备枚举过程分析USB设备运行过程USB设备枚举USB设备通信构成USB设备请求USB枚举过程分析如何改变文本的样式插入链接与图片如…

【算法训练-动态规划 二】【线性DP问题】最长递增子序列

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【动态规划】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

跨境电商:经济合作新引擎,技术赋能新亮点

随着数字化浪潮席卷全球&#xff0c;跨境电商正蓬勃发展&#xff0c;成为中国外贸高质量发展的新引擎。中国的跨境电商行业在"买全球、卖全球"方面正经历着显著的增长&#xff0c;延展出新的商业生态&#xff0c;以技术创新和国际合作为支撑&#xff0c;促进了中国制…

Linux中的shell外壳与权限(包含目录文件的权限,粘滞位的来龙去脉)

Linux中的shell外壳与权限[包含目录文件的权限,粘滞位的来龙去脉] 一.shell外壳的理解1.为什么需要有shell外壳的存在?2.什么是shell外壳?3.shell外壳的运行原理是什么?4.shell和bash的关系 二.Linux中的用户权限1.用户分类与身份切换1.用户分类2.root用户切换为普通用户1.s…

操作系统学习笔记7-IO管理

文章目录 1、IO管理学什么(学习逻辑图)2、IO管理硬件知识-IO设备的分类(硬件分类)3、IO管理硬件知识-IO控制方式的发展过程4、IO管理硬件知识-IO控制方式-程序直接控制方式5、IO管理硬件知识-IO控制方式-中断控制方式6、IO管理硬件知识-IO控制方式-DMA控制方式7、IO管理硬件知识…

JSX 样式处理

学习目标&#xff1a; 能够在 JSX 中实现 CSS 样式处理  1. 行内样式 实现&#xff1a; 在元素身上绑定一个 style 样式   - 行内样式 style function APP(){return (<div className"App"><div style{{color:red,fontSize:10px}}>this is div</d…

Swagger基本使用

文章目录 1. 接口文档2. Open API3. Swagger 简介4. Springfox5. Swagger 基本用法6. Swagger-UI使用7. Swagger配置 1. 接口文档 接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后接口文档又变成重中之重。接口文档固然重要&#xff0c;但是由于项目周期等…

MySQL数据同步到达梦数据库

1.服务器配置 达梦数据库的初始状态是不兼容其他任何数据库模式的&#xff0c;所以必须先设置系统的兼容性&#xff0c;从安装路径的tool文件夹中打开console工具&#xff08;DM控制台工具&#xff09;&#xff0c;设置兼容MySQL。 2.创建用户&#xff08;需要分配权限的操作&…

K8s 之 Helm 部署 MySQL 5.7

Author&#xff1a;rab 目录 一、环境二、部署2.1 安装 NFS2.2 安装 Helm2.3 安装 MySQL2.3.1 创建 Namespace2.3.2 创建 PV2.3.3 配置 MySQL2.3.4 部署 MySQL 2.4 MySQL 可用性验证 小结 一、环境 # K8s版本 v1.23.6# Docker版本 v20.10.20# Helm版本 v3.10.3# NFS v4说明&am…

建筑能源管理(6)——建筑能源监管

中国建筑(公共机构)能耗的总量逐年上升&#xff0c;在能源总消费量中所占的比例已从20世纪70年代末的10%&#xff0c;上升到近年的超过30%。2006年&#xff0c;《中华人民共和国国民经济和社会发展第十一个五年规划纲要》提出了“十一五”期间单位国内生产总值能耗降低20%左右&…

SocketBase类库

SocketBase类库主要是方便创建Socket客户端和Socket服务端的基础实现。 抽象基类&#xff1a;主要实现创建Socket public abstract class NetworkBase{} 通用基类&#xff1a;指定了消息的解析规则&#xff0c;指定了数据转换的规则 的基本实现 /// <summary>/// 支持长…

Flume基本使用--mysql数据输出

MySQL数据输出 在MySQL中建立数据库school&#xff0c;在数据库中建立表student。SQL语句如下&#xff1a; create database school; use school; create table student(id int not null,name varchar(40),age int,grade int,primary key(id) ); 请使用Flume实时捕…

SQL sever中的函数(基础)

目录 一、聚合函数 1.1聚合函数概述 1.2SUM(求和)函数 1.3AVG(平均值)函数 1.4MIN(最小值)函数 1.5MAX(最大值)函数 1.6COUNT(统计)函数 1.6.1COUNT函数用法分类 1.6.2COUNT函数用法示例 1.7DISTINCT(取不重复记录)函数 1.8查询重复记录 二、数学函数 2.1数学函数…

【Java小知识点】类加载器的区别

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理Java类加载器的区别&#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1faf0;&#x1faf…