【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

本身hls为了推广,寻找了一些适合hls开发的领域。图像处理就是其中一个方向。图像处理的应用十分广泛,本身又需要进行短时间的大数据量处理,十分适合hls的使用。所以,xilinx官方提供了hls的函数库,同时为了进行testbench的测试,这些接口本身也兼容opencv已有的接口。

1、头文件引用

#include <hls_video.h>#define MAX_HEIGHT 800
#define MAX_WIDTH 1280typedef 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;typedef unsigned char uchar;
typedef hls::Scalar<1, uchar> GRAY_PIXEL;

头文件引用的部分比较简单,本身只要包含hls_video.h文件即可,剩下来的就是对stream、Mat、Scalar进行类型定义操作。因为在计算的过程中涉及到大量的模板处理,所以编写代码的时候最好选用cpp文件。

2、灰化处理

void rgb2gray(AXI_STREAM& input_stream,AXI_STREAM& output_stream,int rows,int cols)
{#pragma HLS INTERFACE s_axilite port=cols
#pragma HLS INTERFACE s_axilite port=rows
#pragma HLS INTERFACE axis port=output_stream
#pragma HLS INTERFACE axis port=input_stream
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS DATAFLOWRGB_IMAGE img_0(rows, cols);GRAY_IMAGE img_1(rows, cols);RGB_IMAGE img_2(rows, cols);hls::AXIvideo2Mat(input_stream, img_0);hls::CvtColor<HLS_RGB2GRAY, HLS_8UC3, HLS_8UC1>(img_0, img_1);hls::CvtColor<HLS_GRAY2RGB, HLS_8UC1, HLS_8UC3>(img_1, img_2);hls::Mat2AXIvideo(img_2, output_stream);
}

灰化处理是图像处理的第一步,最大的好处就是可以减少计算的数据量。这里的hls::CvtColor都是官方提供的函数。之所以会有两个函数,是因为数据格式的问题,毕竟最后还要回归到AXI_STREAM的形式。

3、高斯滤波

void rgb2gray(AXI_STREAM& input_stream,AXI_STREAM& output_stream,int rows,int cols)
{#pragma HLS INTERFACE s_axilite port=cols
#pragma HLS INTERFACE s_axilite port=rows
#pragma HLS INTERFACE axis port=output_stream
#pragma HLS INTERFACE axis port=input_stream
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS DATAFLOWRGB_IMAGE img_0(rows, cols);GRAY_IMAGE img_1(rows, cols);GRAY_IMAGE img_2(rows, cols);RGB_IMAGE img_3(rows, cols);hls::AXIvideo2Mat(input_stream, img_0);hls::CvtColor<HLS_RGB2GRAY, HLS_8UC3, HLS_8UC1>(img_0, img_1);hls::GaussianBlur<3,3>(img_1, img_2);hls::CvtColor<HLS_GRAY2RGB, HLS_8UC1, HLS_8UC3>(img_2, img_3);hls::Mat2AXIvideo(img_3, output_stream);
}

高斯滤波是实际场景中经常使用到的算法。<3,3>模板也是可以选择的,一般3、5、7都是用的比较多的模板,可以根据实际情况灵活进行配置。

4、直方图增强

void rgb2gray(AXI_STREAM& input_stream,AXI_STREAM& output_stream,int rows,int cols)
{#pragma HLS INTERFACE s_axilite port=cols
#pragma HLS INTERFACE s_axilite port=rows
#pragma HLS INTERFACE axis port=output_stream
#pragma HLS INTERFACE axis port=input_stream
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS DATAFLOWRGB_IMAGE img_0(rows, cols);GRAY_IMAGE img_1(rows, cols);GRAY_IMAGE img_2(rows, cols);RGB_IMAGE img_3(rows, cols);hls::AXIvideo2Mat(input_stream, img_0);hls::CvtColor<HLS_RGB2GRAY, HLS_8UC3, HLS_8UC1>(img_0, img_1);hls::EqualizeHist<HLS_8UC1, HLS_8UC1, MAX_HEIGHT, MAX_WIDTH>(img_1, img_2);hls::CvtColor<HLS_GRAY2RGB, HLS_8UC1, HLS_8UC3>(img_2, img_3);hls::Mat2AXIvideo(img_3, output_stream);
}

直方图增强也是用的比较多的一种方法。它的基本原理就是计算出每个像素个数在整体像素里面的比例,据此依据这个比例来对像素值做出修正处理。

5、Sobel算子

void rgb2gray(AXI_STREAM& input_stream,AXI_STREAM& output_stream,int rows,int cols)
{// sobel算子#pragma HLS INTERFACE s_axilite port=cols
#pragma HLS INTERFACE s_axilite port=rows
#pragma HLS INTERFACE axis port=output_stream
#pragma HLS INTERFACE axis port=input_stream
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS DATAFLOWRGB_IMAGE img_0(rows, cols);GRAY_IMAGE img_1(rows, cols);GRAY_IMAGE img_2(rows, cols);RGB_IMAGE img_3(rows, cols);hls::AXIvideo2Mat(input_stream, img_0);hls::CvtColor<HLS_RGB2GRAY, HLS_8UC3, HLS_8UC1>(img_0, img_1);hls::Sobel<1,0,3>(img_1, img_2);hls::CvtColor<HLS_GRAY2RGB, HLS_8UC1, HLS_8UC3>(img_2, img_3);hls::Mat2AXIvideo(img_3, output_stream);
}

各种算子一般用来对图像进行边缘检测。算子计算式二值化之前的重要步骤。一般经过边缘检测之后,图像中物体的轮廓会变得非常明显,和周围的其他像素有着明显的区别。

6、二值化

void rgb2gray(AXI_STREAM& input_stream,AXI_STREAM& output_stream,int rows,int cols)
{#pragma HLS INTERFACE s_axilite port=cols
#pragma HLS INTERFACE s_axilite port=rows
#pragma HLS INTERFACE axis port=output_stream
#pragma HLS INTERFACE axis port=input_stream
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS DATAFLOWRGB_IMAGE img_0(rows, cols);GRAY_IMAGE img_1(rows, cols);GRAY_IMAGE img_2(rows, cols);RGB_IMAGE img_3(rows, cols);hls::AXIvideo2Mat(input_stream, img_0);hls::CvtColor<HLS_RGB2GRAY, HLS_8UC3, HLS_8UC1>(img_0, img_1);hls::Threshold(img_1, img_2, 150, 255, HLS_THRESH_BINARY);hls::CvtColor<HLS_GRAY2RGB, HLS_8UC1, HLS_8UC3>(img_2, img_3);hls::Mat2AXIvideo(img_3, output_stream);
}

做完了算子计算,下面就是二值化。小于某个数值的像素全部置为0,大于某个数值的像素全部置为255。和灰化类似,通过二值化之后,像素中的信息更为集中和聚焦。

7、膨胀和腐蚀

void rgb2gray(AXI_STREAM& input_stream,AXI_STREAM& output_stream,int rows,int cols)
{#pragma HLS INTERFACE s_axilite port=cols
#pragma HLS INTERFACE s_axilite port=rows
#pragma HLS INTERFACE axis port=output_stream
#pragma HLS INTERFACE axis port=input_stream
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS DATAFLOWRGB_IMAGE img_0(rows, cols);GRAY_IMAGE img_1(rows, cols);GRAY_IMAGE img_2(rows, cols);GRAY_IMAGE img_3(rows, cols);RGB_IMAGE img_4(rows, cols);hls::AXIvideo2Mat(input_stream, img_0);hls::CvtColor<HLS_RGB2GRAY, HLS_8UC3, HLS_8UC1>(img_0, img_1);hls::Dilate(img_1, img_2);hls::Erode(img_2, img_3);hls::CvtColor<HLS_GRAY2RGB, HLS_8UC1, HLS_8UC3>(img_3, img_4);hls::Mat2AXIvideo(img_4, output_stream);
}

二值化之后的图像一般还会存在着空洞、藕断丝连的情况。这个时候可以通过进行开运算、或者是闭运算来解决。换言之,就是用膨胀、腐蚀的方法来解决。这也是图像处理的必要步骤。

8、轮廓提取

轮廓提取一般还是通过cpu来完成,这部分不适合用fpga来进行加速处理。通常fpga做好了灰化、增强、滤波、sobel算子、二值化和膨胀腐蚀之后,会把图像交还给cpu继续进行处理,完成剩下来的操作,这部分式必不可少的。当然,做完了轮廓提取,还要通过周长、面积、圆度等特征做进一步的提取和分析。

9、IP接口部分

这部分的算法只是完成了AXI_STREAM到AXI_STREAM的转换,如果要进行显示,或者返回到cpu运算,还需要其他IP核的协调核、帮助。但总体来说,这部分还是最重要的。一般来说,算法ip会从AXI Video DMA获得数据,处理结束的数据也会还给AXI Video DMA,这是最常用的方法。

10、自定义图像算法

void pixel_binary(GRAY_IMAGE& src, GRAY_IMAGE& dst, uchar binary)
{uchar value;GRAY_PIXEL src_data;GRAY_PIXEL dst_data;for(int i =0 ; i < MAX_HEIGHT; i++){for(int j = 0; j < MAX_WIDTH; j++){
#pragma HLS PIPELINE II=1src >> src_data;value = src_data.val[0];dst_data.val[0] = value > binary ? 255:0;dst << dst_data;}}
}void rgb2gray(AXI_STREAM& input_stream,AXI_STREAM& output_stream,int rows,int cols,uchar binary)
{#pragma HLS INTERFACE s_axilite port=cols
#pragma HLS INTERFACE s_axilite port=rows
#pragma HLS INTERFACE s_axilite port=binary
#pragma HLS INTERFACE axis port=output_stream
#pragma HLS INTERFACE axis port=input_stream
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS DATAFLOWRGB_IMAGE img_0(rows, cols);GRAY_IMAGE img_1(rows, cols);GRAY_IMAGE img_2(rows, cols);RGB_IMAGE img_3(rows, cols);hls::AXIvideo2Mat(input_stream, img_0);hls::CvtColor<HLS_RGB2GRAY, HLS_8UC3, HLS_8UC1>(img_0, img_1);pixel_binary(img_1, img_2, binary);hls::CvtColor<HLS_GRAY2RGB, HLS_8UC1, HLS_8UC3>(img_2, img_3);hls::Mat2AXIvideo(img_3, output_stream);
}

除了hls提供的标准算之外,很多时候用户还需要自定义自己的算法。比如10中的pixel_binary这个函数。binary是通过s_axilite传递的参数,参数直接传递给pixel_binary。在函数中,通过GRAY_PIXEL和binary比较的方法,直接将像素设定为0或者式255。当然,实际应用的场景可能会比这个复杂一点,到时候只要根据具体情况具体分析即可。

11、关于testbench

IplImage2AXIvideo
AXIvideo2IplImage

做testbench的时候,需要把图像换成AXIvideo,等到做完之后,如果需要保存的话,还需要把AXIvideo转换成图像,这一点需要注意一下。有了这两个接口之后,就可以在***_csim.log里面看到对应的测试结果了。

学fpga(hls之图像处理)相关推荐

  1. 零基础学FPGA(一):与FPGA的爱恨情仇

    我笑夏蝉唱不完少年梦 ,他说街灯亮不过明日光. --胡歌 最近挺迷茫的,要做的事真的很多,要学的东西也很多,看见什么都觉得很有趣,很实用,想学一手.记得财哥曾经说过:事情少的时候,你会认真的,抓紧时间 ...

  2. FPGA HLS双线性插值图像缩放视频拼接,上板验证稳定通过,提供3套工程源码和技术支持

    目录 1.前言 2.HLS实现双线性插值图像缩放 3.vivado工程1:1080P缩小720P 4.vivado工程2:1080P缩小后mixer二分频 5.上板调试验证并演示 6.福利:工程代码的 ...

  3. 三叔学FPGA系列之二:Cyclone V中的POR、配置、初始化,以及复位

    对于FPGA内部的复位,之前一直比较迷,这两天仔细研究官方数据手册,解开了心中的诸多疑惑,感觉自己又进步了呢..... 原创不易,转载请转原文,注明出处,谢谢.   一.关于POR(Power-On ...

  4. FPGA——HLS简介

    FPGA--HLS简介 一.HLS/VHDL/Verilog 1.1 HLS简介 1.2 VHDL/Verilog 简介 1.3 总结 二.HLS技术难点 Ending.参考资料 一.HLS/VHDL ...

  5. 零基础学FPGA(五):时序逻辑电路设计之计数器(附有呼吸灯实验、简单组合逻辑设计介绍)

    目录 日常·唠嗑 前言 一.认清逻辑设计 二.时序逻辑电路设计 三.扩展:呼吸灯实验 日常·唠嗑 第一次建立<零基础学FPGA>专栏,是在2021年2月2日,已经过去了一年了,目前只更新了 ...

  6. 零基础学FPGA(八):可编程逻辑单元(基本结构,Xilinx+Altera)

    目录 日常·唠嗑 一.概述 二.基于多路选择器的逻辑单元 1.基于多路选择器的逻辑单元(早期) 2.基于PLD结构的逻辑单元(类CPLD) 3.基于查询表的逻辑单元(目前主流) 三.Xilinx基本结 ...

  7. 学fpga(hls之vivado、zynq和petalinux)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 很多同学学习了fpga,也用到xilinx的vivado,当然也用到了zynq.可是没有弄清楚这 ...

  8. 高层次综合综述:FPGA HLS Today Successes, Challenges, and Opportunities

    Deep Learning FINN 深度神经网络(DNNs)的底层算法结构简单,但是计算量.对数据的访问和模型参数的存储对内存的需求很大.一种可行的方法是将输入.激活和模型参数量化,来降低数值精度, ...

  9. 学fpga(组合逻辑和时序逻辑)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 很多人都以为写fpga,就是编写verilog,学习一门编程语言而已.这种观点,其实只对了一半. ...

最新文章

  1. AWS工具boto3使用笔记
  2. 无人驾驶还不如一个导盲犬可靠吗
  3. 如何在mac上面看充电器的瓦数!
  4. php 将一个字符串转换成数组,PHP将一个字符串转换成数组
  5. 了解如何使用Flutter构建iOS和Android应用
  6. 微机化远动系统与计算机网络,远动技术教案_第3章_微机监控系统数据通信网络结构及原理.pdf...
  7. Redis桌面客户端 Redis Studio
  8. Amber Group创始人兼CEO Michael Wu:CBDC将成为更广义、重要的加密资产
  9. H3C设备之 EASY NAT
  10. Oracle中的Date、TimeStamp和Interval(上)
  11. 8086微型计算机结构功能,3.2 8086微处理器的功能结构
  12. 大企业中,Java面试官最爱问的问题集锦(2)
  13. SpringBoot+Vue项目个性化音乐推荐系统
  14. HTML5期末大作业:运动系列——NBA篮球主题学生网页设计(7个页面) HTML+CSS+JavaScript 体育网页设计HTML代码 学生网页课程设计期末作业下载 大学生网页设计制作成...
  15. gentoo适合做服务器系统吗,Mandriva、Gentoo发行版
  16. 经典语录(确实经典)
  17. unity 回合制_用Unity E3 Goodness制成
  18. 数据库(mysql)之用户管理
  19. 数学分析_Tom Apostol_定理7.48:黎曼可积的充要条件
  20. 二语句法复杂度分析器L2SCA的使用,下载,指标

热门文章

  1. maple绘制地图图形--MapleSoft可视化
  2. server.transfer 无法跳转页面_wordpress404页面制作完整的正确操作流程
  3. oracle crs的管理,Oracle CRS的管理与维护
  4. 中职微课计算机应用基础,高职计算机应用基础微课设计
  5. Android平台上集成大华SDK
  6. Nature Biotechnol: 用16S及18S rRNA全长进行微生物多样性研究
  7. 幻影追逐者服务器维护,《幻影追逐者》游戏特色曝光 开启与邪恶争斗冒险之旅...
  8. python有哪些代码_Python有哪些神一般的蜜汁操作?(附代码),
  9. 浪潮NF5280M5服务器做RAID装windows server2019系统保姆级教学
  10. 稻盛和夫系列之活法一