Altera系列FPGA纯verilog视频图像去雾,基于暗通道先验算法实现,提供4套Quartus工程源码和技术支持

目录

Altera系列FPGA纯verilog视频图像去雾,基于暗通道先验算法实现,提供4套Quartus工程源码和技术支持

1、前言

Altera系列FPGA现状:

Altera系列FPGA目前处于逐步退出市场状态,市场占有率很低、使用便捷性很低、开发生态很不完善,之前还可以凭借价格低廉在低端产品上使用,但如今国产FPGA的崛起让Altera唯一的优势也荡然无存;所以本博主奉劝还在学Altera系列FPGA的同学赶紧悬崖略吗回头是岸,别再浪费宝贵的时间了,未来的FPGA市场,高端市场非Xilinx莫属,中低端市场非国产FPGA莫属;

工程概述

本文使用Altera的Cyclone-IV系列FPGA做基础的图像视频采集系统;视频输入源有多种,一种是传统摄像头,包括OV7725、OV5640和AR0135,另一种是用串口发送有雾图片到FPGA作为输入源;如果你的FPGA开发板没有视频输入接口,或者你的手里没有摄像头时,可以使用FPGA逻辑实现的动态彩条模拟输入视频,代码里通过parametr参数选择视频源,默认不使用动态彩条;FPGA首先对摄像头进行i2c初始化配置,然后采集摄像头视频;然后视频送入图像缓存架构实现视频2帧缓存功能,本设计使用SDRAM作为缓存介质;然后Native视频时序控制图像缓存架构从SDRAM中读取视频,并做Native视频时序同步,输出RGB888视频;然后视频送入纯verilog代码实现的图像去雾模块实现实时图像去雾;然后去雾视频送入RGB转HDMI实现HDMI输出功能;最后视频通过板载HDMI或者LCD输出接口送显示器显示即可;针对市场主流需求,本设计提供4套Quartus工程源码,具体如下:

现对上述3套工程源码做如下解释,方便读者理解:

工程源码1

开发板FPGA型号为Cyclone-IV-EP4CE10F17C8;输入视频为OV7725摄像头或者动态彩条,默认使用OV7725;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为640x480@60Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后视频送入图像缓存架构实现视频2帧缓存功能,本设计使用SDRAM作为缓存介质;然后Native视频时序控制图像缓存架构从SDRAM中读取视频,并做Native视频时序同步,输出RGB888视频,输出分辨率为640x480@60Hz;然后视频送入纯verilog代码实现的图像去雾模块实现实时图像去雾;然后去雾视频送入RGB转HDMI实现HDMI输出功能;最后视频通过板载HDMI输出接口送显示器显示即可;该工程适用Altera系列FPGA实现视频图像去雾系统应用;

工程源码2

开发板FPGA型号为Cyclone-IV-EP4CE10F17C8;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后视频送入图像缓存架构实现视频2帧缓存功能,本设计使用SDRAM作为缓存介质;然后Native视频时序控制图像缓存架构从SDRAM中读取视频,并做Native视频时序同步,输出RGB888视频,输出分辨率为1280x720@60Hz;然后视频送入纯verilog代码实现的图像去雾模块实现实时图像去雾;然后去雾视频送入RGB转HDMI实现HDMI输出功能;最后视频通过板载HDMI输出接口送显示器显示即可;该工程适用Altera系列FPGA实现视频图像去雾系统应用;

工程源码3

开发板FPGA型号为Cyclone-IV-EP4CE10F17C8;输入视频为串口发送来的有雾图片,使用串口上位机发送bmp格式图片到FPGA,图片分辨率为800x480,串口波特率设置为1562500;FPGA接收图片数据后送入图像缓存架构实现视频2帧缓存功能,本设计使用SDRAM作为缓存介质;然后Native视频时序控制图像缓存架构从SDRAM中读取视频,并做Native视频时序同步,输出RGB565视频,输出分辨率为800x480@60Hz;然后视频送入纯verilog代码实现的图像去雾模块实现实时图像去雾;最后去雾图片通过板载LCD输出接口送显示器显示即可;该工程适用Altera系列FPGA实现视频图像去雾系统应用;

工程源码4

开发板FPGA型号为Cyclone-IV-EP4CE10F17C8;输入视频为串口发送来的图片,使用串口上位机发送bmp格式图片到FPGA,图片分辨率为800x480,串口波特率设置为1562500;FPGA接收图片数据后送入图像缓存架构实现视频2帧缓存功能,本设计使用SDRAM作为缓存介质;然后Native视频时序控制图像缓存架构从SDRAM中读取视频,并做Native视频时序同步,输出RGB888视频,输出分辨率为800x480@60Hz;然后视频送入纯verilog代码实现的图像去雾模块实现实时图像去雾;然后去雾视频送入RGB转HDMI实现HDMI输出功能;最后视频通过板载HDMI输出接口送显示器显示即可;该工程适用Altera系列FPGA实现视频图像去雾系统应用;

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

提供完整的、跑通的工程源码和技术支持;

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

免责声明

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

2、相关方案推荐

我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目

其实一直有朋友反馈,说我的博客文章太多了,乱花渐欲迷人,自己看得一头雾水,不方便快速定位找到自己想要的项目,所以本博文置顶,列出我目前已有的所有项目,并给出总目录,每个项目的文章链接,当然,本博文实时更新。。。以下是博客地址:
点击直接前往

Altera系列FPGA相关方案推荐

我专门开设了一个Altera系列FPGA专栏,里面收录了基于Altera系列FPGA的图像处理、UDP网络通信、GT高速接口、PCIE等博客,感兴趣的可以去看看,博客地址:
点击直接前往

本博主已有的图像处理方案

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

3、设计思路框架

工程设计原理框图

工程设计原理框图如下:

输入Sensor之-->OV7725摄像头

输入Sensor是本工程的输入设备,其一为OV7725摄像头,此外本博主在工程中还设计了动态彩条模块,彩条由FPGA内部逻辑产生,且是动态移动的,完全可模拟Sensor,输入源选择Sensor还是彩条,通过Sensor模块的顶层参数配置,默认选择Sensor输入;Sensor模块如下:

SENSOR_TYPE=0;则输出OV7725摄像头采集的视频;

SENSOR_TYPE=1;则输出动态彩条的视频;

OV7725摄像头需要i2c初始化配置,本设计配置为640x480@60Hz分辨率,本设计提供纯verilog代码实现的i2c模块实现配置功能;此外,OV7725摄像头还需要图像采集模块实现两个时钟输出一个RGB565的视频转换为一个时钟输出一个RGB888视频,本设计提供纯verilog代码实现的图像采集模块实现配置功能;动态彩条则由FPGA内部逻辑实现,由纯verilog代码编写;将OV7725摄像头配置采集和动态彩条进行代码封装,形成helai_OVsensor.v的顶层模块,整个模块代码架构如下:

输入Sensor之-->OV5640摄像头

输入Sensor是本工程的输入设备,其一为OV5640摄像头,此外本博主在工程中还设计了动态彩条模块,彩条由FPGA内部逻辑产生,且是动态移动的,完全可模拟Sensor,输入源选择Sensor还是彩条,通过Sensor模块的顶层参数配置,默认选择Sensor输入;Sensor模块如下:

SENSOR_TYPE=0;则输出OV5640摄像头采集的视频;

SENSOR_TYPE=1;则输出动态彩条的视频;

OV5640摄像头需要i2c初始化配置,本设计配置为1280x720@30Hz分辨率,本设计提供纯verilog代码实现的i2c模块实现配置功能;此外,OV5640摄像头还需要图像采集模块实现两个时钟输出一个RGB565的视频转换为一个时钟输出一个RGB888视频,本设计提供纯verilog代码实现的图像采集模块实现配置功能;动态彩条则由FPGA内部逻辑实现,由纯verilog代码编写;将OV5640摄像头配置采集和动态彩条进行代码封装,形成helai_OVsensor.v的顶层模块,整个模块代码架构如下:

输入Sensor之-->串口传图输入

输入Sensor是本工程的输入设备,其三为串口传图作为输入;输入视频为串口发送来的图片,使用串口上位机发送bmp格式图片到FPGA,图片分辨率为800x480,串口波特率设置为1562500;串口传图架构如下:

串口传图模块代码架构如下:

串口传图上位机已放在资料包中,如下:

串口传图上位机使用方法如下:

图像缓存架构

图像缓存架构实现的功能是将输入视频缓存到板载SDRAM中再读出送后续模块,目的是实现视频同步输出,实现输入视频到输出视频的跨时钟域问题,更好的呈现显示效果,其中SDRAM控制器用纯verilog代码实现,所以图像缓存架构就是实现用户数据到SDRAM的桥接作用;架构如下:

图像缓存架构由视频缓存帧更新模块+写视频控制逻辑+读视频控制逻辑+SDRAM控制器模块组成;SDRAM控制器实现了SDRAM初始化、读写时序控制、读写流程控制等功能,写视频控制逻辑、读视频控制逻辑实际上就是一个视频读写状态机,以写视频为例,假设一帧图像的大小为M×N,其中M代表图像宽度,N代表图像高度;写视频控制逻辑每次写入一次突发传输的视频数据,记作Y,即每次向SDRAM中写入Y个像素,写M×N÷Y次即可完成1帧图像的缓存,读视频与之一样;同时调用两个FIFO实现输入输出视频的跨时钟域处理,使得用户可以忽略SDRAM复杂的控制时序,以简单地像使用FIFO那样操作SDRAM,从而达到读写SDRAM的目的,进而实现视频缓存;本设计图像缓存方式为2帧缓存;图像缓存模块代码架构如下:

暗通道先验算法介绍

暗通道先验算法介绍可以百度一下或者csdn或者知乎搜一下看看,专业的讲解我不擅长,我只擅长用fpga实现算法,专业讲原理的大佬比我讲得好,这里可以推荐一篇阅读量很大的文章:
直接点击前往

图像去雾模块性能介绍

优点1:纯verilog代码实现,无任何IP,可在xilinx、altera、国产紫光同创、国产高云、国产易灵思、国产安路等FPGA平台间自由移植;

优点2:算法加速,利用了FPGA并行计算的特点,采用纯verilog代码实现;

优点3:提供了多达23套工程源码,针对不同型号FPGA和输入设备、输入接口做到了广泛的适应性;

优点4:设计精简,消耗FPGA逻辑资源很小,以工程源码1为例,图像去雾模块所占逻辑资源如下:

缺点1:算法还不够完美,去雾效果也不完美,还需持续优化;

缺点2:用于验证、学习、课题研究等可以,做实际产品还不理想;

缺点3:对输入的图像要求稍微有点高,那种色差太过严重的去雾效果不好,我测试的这个视频作为输入源去雾效果是可以的的,兄弟们可以把这个视频作为输入源:
直接点击前往

图像去雾模块详解

图像去雾模块设计架构如下:

图像去雾模块代码架构如下:

图像去雾模块顶层接口如下:

c 复制代码
module defogging_top (
	input		  pixelclk     ,	//像素时钟
	input         reset_n      ,	//低电平复位
	input  [23:0] i_rgb        ,	//原始图像像素数据
	input		  i_hsync      ,	//原始图像行同步
	input		  i_vsync      ,	//原始图像场同步
	input		  i_de         ,	//原始图像数据有效
	input [7:0]   i_thre       ,	//大气光阈值,初始值为8'd26,数值越小,去雾效果越好
	output [23:0] o_defog_rgb  ,	//去雾图像像素数据
	output		  o_defog_hsync,	//去雾图像行同步
	output		  o_defog_vsync,	//去雾图像场同步    
	output		  o_defog_de    	//去雾图像数据有效          
);

图像去雾模块由纯verilog代码实现,采用暗通道先验算法理论,由3个模块顺序执行,3个模块内部并行执行,实现了FPGA加速算法的目的,分别由求RGB最小值模块、求折射率模块、图像去雾组成;

求RGB最小值的目的是实时的比较求出每个像素点RGB分量的最小值,也就是暗通道,该模块顶层接口如下:

求折射率的目的是输出暗通道最大值和折射率,该模块顶层接口如下:

该模块有个i_thre输入接口,该接口为阈值,初始值为26,数值越小,去雾效果越好,vivado工程中通过VIO动态控制;

图像去雾的目的是输出暗通道最大值和折射率,该模块顶层接口如下:

HDMI输出架构

HDMI输出包括Native视频时序和HDMI编码,Native视频时序的作用是产生传统VGA的、RGB的视频流;HDMI编码采用RTL逻辑编码方式;HDMI输出代码架构如下:

LCD输出架构

使用Native视频时序产生LCD输出的时序,本设计使用5寸TFT-CLD屏幕;CLD输出代码架构如下:

工程源码架构

以工程2为例,工程源码架构如下,其他工程与之类似:

4、Quartus工程源码1详解:OV7725输入-HDMI输出版本

开发板FPGA型号:Altera--Cyclone-IV系列-EP4CE10F17C8;

开发环境:Quartus 18.1;

输入:OV7725摄像头或FPGA内部动态彩条,分辨率640x480@60Hz;

输出:HDMI,RTL逻辑编码,分辨率640x480@60Hz;

图像处理:纯Verilog代码实现的实时图像去雾;

图像去雾算法:暗通道先验算法;

图像缓存方案:纯Verilog图像缓存,2帧缓存;

工程源码架构请参考前面第3章节中的《工程源码架构》小节;

工程作用:此工程目的是让读者掌握Altera系列FPGA实现视频图像去雾的设计能力,以便能够移植和设计自己的项目;

工程的资源消耗和功耗如下:

5、Quartus工程源码2详解:OV5640输入-HDMI输出版本

开发板FPGA型号:Altera--Cyclone-IV系列-EP4CE10F17C8;

开发环境:Quartus 18.1;

输入:OV5640摄像头或FPGA内部动态彩条,分辨率1280x720@30Hz;

输出:HDMI,RTL逻辑编码,分辨率1280x720@60Hz;

图像处理:纯Verilog代码实现的实时图像去雾;

图像去雾算法:暗通道先验算法;

图像缓存方案:纯Verilog图像缓存,2帧缓存;

工程源码架构请参考前面第3章节中的《工程源码架构》小节;

工程作用:此工程目的是让读者掌握Altera系列FPGA实现视频图像去雾的设计能力,以便能够移植和设计自己的项目;

工程的资源消耗和功耗如下:

6、Quartus工程源码3详解:串口传图输入-LCD输出版本

开发板FPGA型号:Altera--Cyclone-IV系列-EP4CE10F17C8;

开发环境:Quartus 18.1;

输入:串口传图,图片分辨率800x480;

输出:5寸LCD屏,分辨率800x480@60Hz;

图像处理:纯Verilog代码实现的实时图像去雾;

图像去雾算法:暗通道先验算法;

图像缓存方案:纯Verilog图像缓存,2帧缓存;

工程源码架构请参考前面第3章节中的《工程源码架构》小节;

工程作用:此工程目的是让读者掌握Altera系列FPGA实现视频图像去雾的设计能力,以便能够移植和设计自己的项目;

工程的资源消耗和功耗如下:

7、Quartus工程源码4详解:串口传图输入-HDMI输出版本

开发板FPGA型号:Altera--Cyclone-IV系列-EP4CE10F17C8;

开发环境:Quartus 18.1;

输入:串口传图,图片分辨率800x480;

输出:HDMI,RTL逻辑编码,分辨率800x480@60Hz;

图像处理:纯Verilog代码实现的实时图像去雾;

图像去雾算法:暗通道先验算法;

图像缓存方案:纯Verilog图像缓存,2帧缓存;

工程源码架构请参考前面第3章节中的《工程源码架构》小节;

工程作用:此工程目的是让读者掌握Altera系列FPGA实现视频图像去雾的设计能力,以便能够移植和设计自己的项目;

工程的资源消耗和功耗如下:

8、上板调试验证并演示

准备工作

你需要有以下装备才能移植并测试该工程代码:

1:FPGA开发板;

2:OV7725或OV5640摄像头或笔记本电脑,没有则请使用FPGA内部生成的彩条;

3:HDMI传输线;

4:HDMI显示,要求分辨率支持1920x1080;

Altera系列FPGA视频图像去雾效果演示

Altera系列FPGA视频图像去雾效果演示如下:

Altera-去雾

9、福利:工程源码获取

福利:工程代码的获取

代码太大,无法邮箱发送,以某度网盘链接方式发送,

资料获取方式:私,或者文章末尾的V名片。

此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务:

相关推荐
hahaha60164 小时前
常见相机的ISP算法
数码相机·fpga开发
GateWorld6 小时前
《深入解析SPI协议及其FPGA高效实现》-- 第一篇:SPI协议基础与工作机制
fpga开发·开源协议
牵星术小白8 小时前
【ARM】【FPGA】【硬件开发】Chapter.1 AXI4总线协议
fpga开发
千码君201611 小时前
电子电路:怎么理解时钟脉冲上升沿这句话?
fpga开发·示波器·晶振·时钟脉冲·上升沿-电压跳变·cmos晶体管导通特性·前级信号
余大大.12 小时前
AMBA总线家族成员
fpga开发
9527华安15 小时前
FPGA纯verilog实现MIPI-DSI视频编码输出,提供工程源码和技术支持
fpga开发·音视频·mipi·dsi
156082072191 天前
飞腾D2000与FPGA结合的主板
fpga开发
baowxz1 天前
FPGA管脚类型,及选择
fpga开发
辣个蓝人QEX2 天前
【ZYNQ Linux开发】使用 boot.scr 启动 Linux 报错 Bad Linux ARM64 Image magic! 调试过程记录
linux·运维·fpga开发·zynq·petalinux·zynq mpsoc
一条九漏鱼2 天前
uart verilog 三段式状态机
fpga开发