VIVADO HLS图像处理

VIVADO HLS实现灰度转化

实验设计目的:
将RGB彩色三通道图像转化为灰度单通道图像。
实验步骤:
之前文章介绍过VIVADO HLS图像处理的一般步骤是将IplImage图像类型转化为AXI STREAM图像类型,再将AXI STREAM图像类型转化为HLS Video视频库可处理的MAT类型,输出部分逆转化成IplImage图像类型输出即可。其中AXI STREAM图像类型转化为MAT类型,MAT类型转化为AXI STREAM图像类型是可被综合的。
第一步:首先定义函数头文件

#ifndef  _rgb2gray_h_
#define  _rgb2gray_h_
#include "hls_opencv.h"

#define INPUT_IMAGE "image_in.bmp"
#define OUTPUT_IMAGE "image_out.bmp"
#define GOLD_IMAGE   "image_gold.bmp"
//数据类型定义
typedef  hls::stream<ap_axiu<32,1,1,1> > AXI_STREAM;
typedef  hls::Mat<1024,1024,HLS_8UC3>   IMAGE_RGB;
typedef  hls::Mat<1024,1024,HLS_8UC1>   IMAGE_GRAY;

void rgb2gray(AXI_STREAM &src,AXI_STREAM &dst,int rows,int cols);

#endif

注意:.h文件在写完编译时不能放在src文件目录下,需要删去。

第二步:RGB图像转灰度图像函数

#include "rgb2gray.h"

void rgb2gray(AXI_STREAM &src,AXI_STREAM &dst,int rows,int cols)
{
	IMAGE_RGB imag1(rows,cols);
	IMAGE_GRAY imag2(rows,cols);
	IMAGE_RGB imag3(rows,cols);
    hls::AXIvideo2Mat(src,imag1);
    hls::CvtColor<HLS_RGB2GRAY>(imag1,imag2);  //RGB图像转化为灰度图像
    hls::CvtColor<HLS_GRAY2RGB>(imag2,imag3); //最终图像保存为rgb图像,把灰度图像转化为RGB但此时只有灰度一个通道的值
    hls::Mat2AXIvideo(imag3,dst);//将处理完的视频流数据转化为axi_video输出

}

注意:每次存储图像时需要自己定义一个存储空间,并且每个存储空间只能使用一次,用完最好进行释放,避免内存越来越少导致编译越来越卡。同时图像也只能处理一次,不能同时对一幅图像处理多次。

第三步:test测试文件编写

#include "./../src/rgb2gray.h"
#include "hls_opencv.h"

int main(int argc,int ** argv)//main函数返回类型int型,返回0则表示仿真结果正确,否则错误
{
	IplImage  *src=cvLoadImage(INPUT_IMAGE);  //加载图像
	IplImage  *dst=cvCreateImage(cvGetSize(src),src->depth,src->nChannels);//开辟一个Ipl输出图像存储空间
	AXI_STREAM axi_src,axi_dst; //转换成AXI形式调用函数处理
	IplImage2AXIvideo(src,axi_src);
	rgb2gray(axi_src,axi_dst,src->height,src->width);
	AXIvideo2IplImage(axi_dst,dst);
	cvSaveImage(OUTPUT_IMAGE,dst);
	//return 0;
	//生成gold图像
	IplImage *tmp_g = cvCreateImage(cvGetSize(src),src->depth,1);
	IplImage *tmp   = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
    cvCvtColor(src,tmp_g,CV_RGB2GRAY);
    cvCvtColor(tmp_g,tmp,CV_GRAY2RGB);
    cvSaveImage(GOLD_IMAGE,tmp);
    cvReleaseImage(&src);//用完空间再释放出去,避免越来越卡
    cvReleaseImage(&dst);
    cvReleaseImage(&tmp_g);
    cvReleaseImage(&tmp);
    //与gold图像对比
    char tmp_buf[2000];
    sprintf(tmp_buf,"diff -w %s %s",OUTPUT_IMAGE,GOLD_IMAGE);
    int result = system(tmp_buf);//result=0 is ok ,result=1 is error
    if(result ==0)
    {
    	printf("test is ok! \n");
    	return result;
    }
    else
    {
    	printf("test is error! \n");
    	return result;
    }
}

test.cpp函数文件中:首先加载图像,然后调用该函数进行处理,最终输出图像。该图像处理函数是调用HLS_VIDEO库函数进行处理的,本次test文件中将该库函数处理的图像和使用opencv图像库函数处理生成的图像进行对比,看两种处理结果是否一样从而验证我们编写的函数的正确性。虽然最后test不通过,但是从视觉上图像显示正确。不通过的原因是图像像素之间的有些值存在些许差异,不能达到完全的一致因此报错不通过。

第四步:执行C仿真验证输出结果
输入的原始RGB图像:image_in
在这里插入图片描述
HLS_VIDEO函数图像处理的结果展示:image_out
在这里插入图片描述
OPENCV函数库图像处理结果展示:image_gold
在这里插入图片描述
总结:可以看到图像处理最终输出的结果一致,验证了编写函数的正确性。通过此次实验可以对VIVAO HLS的图像处理过程有一个大致的了解,为后续复杂图像算法在VIVADO HLS上的实现做下学习铺垫。

视频课程源:http://xilinx.eetop.cn/category-83 目录 1 从软件工程师的角度来看 FPGA 架构 3 2 Vivado HLS的工作机制 5 3-4 HLS设计流程基本概念 9 5 任意精度数据类型 15 5.1 C语言支持的数据类型 15 5.2 sizeof()函数使用 16 5.3 设置Visual Studio支持任意精度数据类型 17 6 数组类型转换 17 6.1 变量的定义和初始化 17 6.2 定点数据类型 18 6.3 浮点数据类型的定义和初始化 19 6.4 隐式数据类型转换 19 6.5 显示数据类型转换 19 7 Vivado HLS中的复合数据类型 20 7.1 结构体 20 7.2 枚举类型 22 8 Vivado HLS中的C++基本运算 23 9 测试平台的基本架构 25 9.1 Test Bench 25 9.2 C Test Bench 26 10 测试激励 28 11 测试输出检测与格式控制 28 11.1 Scoreboard 28 11.2 输出格式控制 30 12 接口综合基本介绍 33 12.1 接口综合概述 33 12.2 block-level interface protocol和port-level interface protocol 34 13 接口综合之数组 35 14 接口综合案例演示 37 14.1 添加寄存器 37 14.2 添加时钟使能信号 38 14.3 指令优化 38 15 for循环优化-基本性能指标 40 15.1 基本衡量指标 40 15.2 for循环pipeline 41 15.3 for循环UNROLL展开 41 15.4 for循环变量i 42 16 for循环优化-循环合并 42 17 for循环优化-数据流 46 18 for循环优化-嵌套的for循环优化 54 18.1 循环嵌套类型 54 18.2 Perfect loop nest示例 55 18.3 Imperfect loop nest示例 56 19 for循环优化-其他优化方法 59 19.1 for循环的并行性 59 19.2 for循环pipeline时的rewind选项 61 19.3 for循环的循环边界是变量时处理方法 64 20 数组优化-数组分割 67 20.1 数组接口 67 20.2 数组分割 67 21 数组优化-数组映射和重组 69 21.1 数组的映射 69 21.2 数组的重组 72 21.3 综合对比 72 22 数组优化-其他优化方法 72 22.1 定义ROM 72 22.2 数组的初始化 74 23 函数层面优化 75 23.1 代码风格 75 23.2 Inline 75 23.3 Allocation 75 23.3 Dataflow 75 24 总结分析 77 24.1 改善吞吐率(Throughput) 77 24.2 改善时延(Latency) 78 24.3 改善资源(Area) 79
Vivado HLS 是 Xilinx 公司推出的一款高级综合工具,可以将 C/C++ 等高级语言代码转换为硬件描述语言 VHDL/Verilog,从而实现硬件加速。在图像处理领域,使用 Vivado HLS 可以将图像处理算法实现为硬件电路,提高算法运行速度和功耗效率。 以下是 Vivado HLS图像处理中的基本应用: 1. 图像滤波:图像滤波是图像处理中的基本操作,可以去除噪声、增强图像细节等。常用的滤波算法有均值滤波、中值滤波、高斯滤波等。使用 Vivado HLS 可以将这些算法实现为硬件电路,加速图像滤波操作。 2. 图像变换:图像变换是将图像从一个空间域转换到另一个空间域的操作,如傅里叶变换、小波变换等。这些变换算法需要大量的计算,使用 Vivado HLS 可以将其实现为硬件电路,提高计算速度。 3. 图像分割:图像分割是将图像分成多个区域的操作,常用的算法有阈值分割、边缘检测等。使用 Vivado HLS 可以将这些算法实现为硬件电路,提高图像分割速度。 4. 特征提取:图像特征提取是从图像中提取出特定的特征,如角点、边缘等。常用的特征提取算法有Harris角点检测、SIFT算法等。使用 Vivado HLS 可以将这些算法实现为硬件电路,提高特征提取速度。 总之,Vivado HLS图像处理领域中有着广泛的应用,可以加速图像处理算法的运行,提高系统性能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三岁囍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值