FPGA图像处理HLS实现sobel边沿检测,提供HLS工程和vivado工程源码
目录
- 一、sobel边沿检测原理
- 二、HLS方案实现sobel边沿检测
- 三、HLS在线仿真并导出IP
- 四、Kintex7开发板vivado工程验证
- 五、zynq7100开发板vivado工程验证
- 六、板级调试验证
- 七、福利:工程源码获取
一、sobel边沿检测原理
所谓边缘是指其周围像素灰度急剧变化的那些象素的集合,它是图像最基本的特征。边缘存在于目标、背景和区域之间,所以,它是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,因此,边缘也是图像匹配的重要的特征。
边缘检测和区域划分是图像分割的两种不同的方法,二者具有相互补充的特点。在边缘检测中,是提取图像中不连续部分的特征,根据闭合的边缘确定区域。而在区域划分中,是把图像分割成特征相同的区域,区域之间的边界就是边缘。由于边缘检测方法不需要将图像逐个像素地分割,因此更适合大图像的分割。边缘大致可以分为两种,一种是阶跃状边缘,边缘两边像素的灰度值明显不同;另一种为屋顶状边缘,边缘处于灰度值由小到大再到小的变化转折点处。边缘检测的主要工具是边缘检测模板。边缘检测的有很多,典型的有索贝尔算子、普里维特算子、罗伯茨交叉边缘检测等边缘检测技术,在设计中采用的是索贝尔算子。
索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。Sobel 卷积因子为:
该算子包含两组 3x3 的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向
的亮度差分近似值。如果以 A 代表原始图像,Gx 及 Gy 分别代表经横向及纵向边缘检测的图像灰度值,
其公式如下:
图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:
通常,为了提高效率 使用不开平方的近似值,但这样做会损失精度,迫不得已的时候可以如下这样子:
如果梯度 G 大于某一阀值,则认为该点(x,y)为边缘点。
二、HLS方案实现sobel边沿检测
在前面的sobel边沿检测原理中详细介绍了sobel边沿检测的算法公式,看起来很复杂很NB对吧?
然并卵!!!!!!!
然并卵!!!!!!!
然并卵!!!!!!!
因为对于HLS来说,干这活儿只需要一句话一行代码即可实现;
因为Xilinx早就帮你做好了sobel边沿检测的库,并且可以综合,既然如此,我还需要去管他怎么实现的,算法公式是怎样的吗?这就是HLS的NB之处。。。
HLS工程如下:
综合后的延时、资源占用等性能参数如下:
头文件如下:
#ifndef _HELAI_HLS_SOBEL_H
#define _HELAI_HLS_SOBEL_H#include "hls_video.h"#define MAX_HEIGHT 1080//图像最大高度
#define MAX_WIDTH 1920//图像最大宽度#define INPUT_IMAGE "luoli.jpg"
#define OUTPUT_IMAGE "luoli_hls.jpg"typedef hls::stream<ap_axiu<24,1,1,1> > AXI_STREAM;
typedef hls::Mat<MAX_HEIGHT,MAX_WIDTH,HLS_8UC3> RGB_IMAGE;
typedef hls::Mat<MAX_HEIGHT,MAX_WIDTH,HLS_8UC1> GRAY_IMAGE;void helai_hls_sobel(AXI_STREAM&INPUT_STREAM,AXI_STREAM&OUTPUT_STREAM,int rows,int cols);
#endif
源文件的核心代码如下:
hls::Sobel<1,0,3>(img_1,img_2); //将灰度数据与Sobel算子卷积
核心代码就一句话,BN吧?呵呵。。。。。。
三、HLS在线仿真并导出IP
仿真源文件如下:
#include "helai_hls_sobel.h"
#include "hls_opencv.h"int main(void)
{//获取图像数据IplImage* src = cvLoadImage(INPUT_IMAGE);IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);//使用HLS库进行处理AXI_STREAM src_axi,dst_axi;IplImage2AXIvideo(src,src_axi);helai_hls_sobel(src_axi,dst_axi,src->height,src->width);AXIvideo2IplImage(dst_axi,dst);//保存图像cvSaveImage(OUTPUT_IMAGE,dst);//显示图像cvShowImage(INPUT_IMAGE,src);cvShowImage(OUTPUT_IMAGE,dst);//等待用户按下键盘上的任一按键cv::waitKey(0);
}
话不多说直接看HLS仿真结果:
仿真完整成功后即可综合再导出IP:
四、Kintex7开发板vivado工程验证
开发板:Xilinx Kintex7开发板;
开发环境:HLS2019.1;vivado2019.1;
输入:OV5640摄像头,输入分辨率1280x720;
输出:HDMI,输出分辨率1920x1080;
工程BD如下:
生成顶层RTL如下:
SDK主函数源码如下:
#include <stdio.h>
#include "xgpio.h"
#include "oak_iic.h"
#include "unistd.h"
#include "helai_vdma.h"
#include "helai_color_back.h"
#include "helai_hls_sobel.h"XGpio_Config *XGpioCfg;
XGpio led_gpio;#define AXI_GPIO_DEVICE_ID XPAR_GPIO_0_DEVICE_IDint main(){XGpioCfg = XGpio_LookupConfig(AXI_GPIO_DEVICE_ID);XGpio_CfgInitialize(&led_gpio, XGpioCfg, XGpioCfg->BaseAddress);XGpio_SetDataDirection(&led_gpio, 1, 0); //outputXGpio_DiscreteWrite(&led_gpio, 1, 0);oak_i2c_init(OV5640_IIC_BASEADDR, 1000000, 0x78>>1, IIC_REG_LEN16, IIC_DATA_LEN8);OV5640_Init(OV5640_IIC_BASEADDR,1280,720);helai_hls_sobel(720,1280);helai_vdma();while(1){usleep(500000);XGpio_DiscreteWrite(&led_gpio, 1, 1);usleep(500000);XGpio_DiscreteWrite(&led_gpio, 1, 0);}
}
五、zynq7100开发板vivado工程验证
开发板:Xilinx zynq7100开发板;
开发环境:HLS2019.1;vivado2019.1;
输入:OV5640摄像头,输入分辨率1280x720;
输出:HDMI,输出分辨率1920x1080;
工程BD如下:
生成顶层RTL如下:
SDK主函数源码如下:
#include "I2C_16bit.h"
#include "xiicps.h"
#include "xil_io.h"
#include "xparameters.h"
#include "helai_vdma.h"
#include "helai_hls_sobel.h"void main()
{// Initialize OV5640 regesiterI2C_config_init();helai_hls_sobel(720,1280);helai_vdma();while (1) ;
}
六、板级调试验证
K7开发板和zynq开发板实物连接如下:图中K7为连接状态
运行结果静态展示:
下载程序后运行结果如下:以K7开发板为例,持续运行48小时无问题
HLS图像处理sobel
七、福利:工程源码获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料如下:获取方式:私,或者文章末尾的V名片。
K7开发板网盘资料如下:
zynq开发板网盘资料如下:
FPGA图像处理HLS实现sobel边沿检测,提供HLS工程和vivado工程源码相关推荐
- FPGA图像处理HLS实现RGB转灰度,提供HLS工程和vivado工程源码
目录 一.图像RGB转灰度原理 二.HLS方案实现 三.HLS在线仿真并导出IP 四.Kintex7开发板vivado工程验证 五.zynq7100开发板vivado工程验证 六.板级调试验证 七.福 ...
- FPGA驱动FT601实现USB3.0相机 OV5640视频采集 提供2套工程源码和QT上位机源码
目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.vivado工程1--彩条视 ...
- FPGA实现MPEG2视频压缩 提供工程源码和技术支持
1.前言 MJPEG.MPEG2.MPEG4.H264 是流行且兼容性很高的 4 种视频编码格式.其中 MJPEG 对每帧独立进行 JPEG 图象压缩,而不利用帧间相关性,因此压缩效果较差. MPEG ...
- FPGA驱动FT601实现USB3.0相机HDMI视频采集 提供工程源码和QT上位机源码
目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.详细设计方案 5.vivad ...
- FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持
目录 1.HDMI输入输出设计框架 2.silicon9011/9013芯片详解及配置 3.silicon9134芯片详解及配置 4.FPGA工程介绍 5.上板调试验证 6.福利:工程源码获取 1.H ...
- FPGA HLS双线性插值图像缩放视频拼接,上板验证稳定通过,提供3套工程源码和技术支持
目录 1.前言 2.HLS实现双线性插值图像缩放 3.vivado工程1:1080P缩小720P 4.vivado工程2:1080P缩小后mixer二分频 5.上板调试验证并演示 6.福利:工程代码的 ...
- FPGA基础入门篇(四) 边沿检测电路
FPGA基础入门篇(四)--边沿检测电路 一.边沿检测 边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲.这在FPGA电 ...
- FPGA找工作写简历,你离高薪offer只差一个高端项目,提供工程源码和技术支持
这里写目录标题 1.前言 2.你或许很菜 3.工程源码 4.技术支持 5.工程源码和技术支持获取方式 1.前言 如果你是即将毕业的学生或是想转行做FPGA的工程师,你都会面临一个问题,那就是找工作,找 ...
- FPGA纯Verilog实现任意尺寸图像缩放,串口指令控制切换,贴近真实项目,提供工程源码和技术支持
目录 1.前言 2.目前主流的FPGA图像缩放方案 3.本方案的优越性 4.详细设计方案 5.vivado工程详解 6.上板调试验证并演示 7.福利:工程源码获取 1.前言 代码使用纯verilog实 ...
最新文章
- linux ico图标大小,带、你了解ico图标文件格式
- java 之 学习过程中遇到的大佬博客
- 多项式乘法c语言,急!!!!c语言:求n次多项式的加法和乘法
- phpMyAdmin import.php 跨站脚本漏洞
- 1.两个VLAN通过两个交换机与路由器的通信
- 根据ip地址获得天气预报
- 【6】nagios从零学习使用 - centreon发送邮件报警
- linux初始化进程ppid号,linux基础(十一)--系统初始化的简谈
- Django congtent types应用
- iphone屏蔽系统更新_iOS13屏蔽系统更新升级教程
- 获取屏幕的宽高 android,Android获取屏幕宽高的方法
- Oracle——集合运算
- 配置Voice vlan
- 探讨 .NET 语言的 using statement 与资源释放
- Hive报错:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
- 区块链测试 以太坊 truffle是什么 怎么用
- 梅创社c语言课本答案解析,c语言程序设计第2版) 教学课件 作者 梅创社答案 第一章答案.docx...
- 微信emoji表情编码 、MySQL 存储 emoji 表情符号字符集
- java读取txt文件内容
- web前端基础 html5+css3(七.PS切图与项目实战(学成在线))
热门文章
- 计算机网络配置——路由器的配置
- 超简单制作多系统启动U盘教程
- 多轴控制玻璃行业程序 相机 ST LAD SFC
- SSH密钥登录系统报错Permissions 0644 for ‘xxx‘ re too open
- C语言零碎知识点之定义指针时星号靠近类型名还是变量名
- python通达信5分钟转,10分钟,15分钟,30分钟,60分钟,量化交易,K线
- API NetUserChangePassword Did yer sd1
- android QVGA WQVGA HVGA VGA WVGA各个分辨率的区别
- java系统开发注意事项
- html5设置app启动页,使用Ken Burns Effect制作App启动页