1)摘自【正点原子】领航者ZYNQ之HLS 开发指南
2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761
3)全套实验源码+手册+视频下载:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html
4)对正点原子FPGA感兴趣的同学可以加群讨论:876744900
5)正点原子资料更新和新品发布,请加正点原子公众号:正点原子 关注方法:微信→添加好友→公众号→输入:正点原子
第八章基于OV5640的视频图像叠加实验
视频图像叠加技术是当前在屏幕显示(onscreen display,OSD)技术的一个重要部分。视频图像叠加技术在雷达监测口、汽车智能、医学成像等方面应用越来越广。本章节我们将使用Vivado HLS生成一个图像彩条叠加的IP核,来进行基于OV5640的视频图像叠加实验。
本章包括以下几个部分:
88.1简介
8.2实验任务
8.3HLS设计
8.4IP验证
8.5下载验证
8.1简介
视频图像叠加是指在原视频图像中叠加另一视频图像信号,使得原视频图像中叠加上字符或图像。其基本原理就是将存放在存储器里的字符或图像转换成满足一定格式要求的信号,同输入的另一组图像或视频信号合并,使被叠加的图像信号与原视频图像信号在指定位置上同步显示。图像叠加过程是以像素为基本单元的。
视频图像叠加采用的算法是Alpha透明混叠算法,其主要公式:
imgL(x,y)= Alpha(x,y) * imgM(x,y)+(1 - Alpha(x,y) * imgN(x,y))
在上述公式中, imgL(x,y)表示叠加后的图像,Alphal(x,y)表示前景图像(被叠加的图像)透明度; imgM(x,y)表示前景图像(被叠加的图像);imgN(x,y)表示背景图像。本章实验中我们将基于上述公式实现视频图像叠加实验。
![b96f0d752b6219daaf8adf484e058f73.png](https://i-blog.csdnimg.cn/blog_migrate/e84b7382f33bb8b744922748de96c737.png)
图 8.1.1 前景图、背景图、叠加图
如上图所示:“colorbar”表示前景图像M,“lena”表示背景图像N,”lena_colorbar”表示叠加之后的图像imgL。
图像的透明度是相对的,即一张图的透明程度是与另一张图作为对照的结果。通常我们使用电脑工具看到的图像透明都是以背景为对照的。其原理就是,两张图叠加,M为前景图,N为背景图。此时透明度为Alpha,那么M图RGB分量占比Alpha,N图RGB分量占比(1-Alpha),两者之和即为新图的RGB分量,也就是我们看到的叠加之后的图像,这里前后景是按100%分配,当然你也可以按256分配(数字图像中透明度分为256级)。M、N分别对应公式中的imgM(x,y)和imgN(x,y)。
Alpha取不同值时会产生不同的叠加效果,当Alpha(x,y)取值为1时,图像imgM(x,y)完全不透明,此时只显示图像imgM(x,y);当Alpha(x,y)取值为0时,图像imgM(x,y)完全透明,此时只显示图像imgN(x,y)。下面我们给出公式中Alpha按256分配时的计算公式:
R(L) = (Alpha * R(M) + (255 - Alpha) * R(N) ) >> 8
G(L) =( Alpha * G(M) + (255 - Alpha) * G(N) ) >> 8
B(L) =( Alpha * B(M) + (255 - Alpha) * B(N)) >> 8
上述公式中, R(L)、G(L)、B(L)分别指叠加后的图像L的RGB分量,R(M)、G( M)、B(M)分别指前景图像M的RGB分量,R(N)、G(N)、B(N)分别指背景图像N的RGB分量,易知Alpha值取0表示图像M完全透明,取255则表示图像M完全不透明。
8.2实验任务
本节的实验任务是使用Vivado HLS设计图像彩条叠加的IP核,并在Vivado中对设计出来的IP核进行验证。
8.3HLS设计
我们在电脑中的“F:ZYNQHigh_Level_Synthesis”目录下新建一个名为add_image_colorbar的文件夹,作为本次实验的工程目录。然后打开Vivado HLS工具,创建一个新的工程。设置工程名为“add_image_colorbar”,选择工程路径为刚刚创建的文件夹。需要注意的是,工程名以及路径只能由英文字母、数字和下划线组成,不能包含中文、空格以及其他特殊字符。如下图所示:
![e0ebac00ea87b37fb64d38709f54295d.png](https://i-blog.csdnimg.cn/blog_migrate/c542e264f52a237437a330d7f732814f.png)
图 8.3.1 工程配置界面
设置好工程名及路径之后,点击“Next”,进入如下界面设置顶层函数:
![3200ebae3140266a120017a568f69622.png](https://i-blog.csdnimg.cn/blog_migrate/1a8648374d9923fc0a4ce35c959a5a5a.png)
图 8.3.2 设置顶层函数
工程创建完成后,在工程面板中的“source”目录上点击右键,然后在打开的列表中选择“New File”新建源文件,在弹出的对话框中输入源文件的名称“add_image_colorbar.cpp”,如图1.3.3所示。源文件默认的保存路径为HLS工程目录,为方便源文件的管理,我们在工程目录下新建一个名为“src”的文件下,将源文件保存在src目录下。
![c82fd7fd395dd26bf5a5af9283f96215.png](https://i-blog.csdnimg.cn/blog_migrate/94b6e292374a414b01039deddd22d2e4.png)
图 8.3.3 输入源文件名
我们在这里使用Vivado HLS提供的视频库“hls_video.h”,由于这个视频库使用C++语言编写的,那么后缀名需要设置为“.cpp”。设置好文件名和路径之后,点击“保存”。
“lcd_rgb_colorbar.c”文件源代码如下:
- 1 #include "add_image_colorbar.h"
- 2
- 3 void add_image_colorbar(RGB_IMAGE& src, RGB_IMAGE& dst, int rows, int cols, int alpha)
- 4 {
- 5 //定义输入和输出图像像素数据
- 6 RGB_PIXEL src_data;
- 7 RGB_PIXEL dst_data;
- 8
- 9 int color_edge = cols/7; //7个彩条叠加
- 10
- 11 //获取图像数据
- 12 for(int y_pos = 0; y_pos < rows; y_pos++){
- 13 for(int x_pos = 0; x_pos < cols; x_pos++){<