zynq实现视频动态字符叠加OSD,提供2套工程源码和技术支持

1.网上同行的OSD方案(太low)

视频的字符叠加,简称OSD,是FPGA图像处理的基本操作,网上也有很多参考例程,但大多无法实现动态字符叠加,目前网上同行给出的方案有如下:
使用字模软件生成点阵信息,一般是十六进制,然后把点阵信息初始化到FPGA,也就是上电复位是写入寄存器中,或是写入RAM或ROM中,然后输出到显示器;
这样的方法很简单很直接,但有个问题,我要输出不同的字符,然后把所有需要的字符都用字模软件生成点阵信息?这也太麻烦了吧?

2.本方案OSD的优势

相比之下,本方案就很实用了;本方案优势如下:
1、使用软件动态配置字符,SDK写入;
2、字符的显示位置、颜色等软件动态配置;
3、软硬件(PL、PS)交互方案,对于学生而言可以提高项目的高端性;
缺点:由于加载了国标字库,所以ram占用较大,只适用于zynq系列期间,A7和低配的K7都不适用;

3.HLS实现方案

OSD采用HLS方案实现,处理流程部分代码如下:

void overlayosd(vstream_t &video_in, vstream_t &video_out, unsigned int *pMem, int rows, int cols)
{
#pragma HLS INTERFACE axis port=video_in
#pragma HLS INTERFACE axis port=video_out
#pragma HLS INTERFACE m_axi port=pMem offset=slave
#pragma HLS INTERFACE s_axilite port=rows
#pragma HLS INTERFACE s_axilite port=cols
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE s_axilite port=overly_x
#pragma HLS INTERFACE s_axilite port=overly_y
#pragma HLS INTERFACE s_axilite port=overly_w
#pragma HLS INTERFACE s_axilite port=overly_h

	hls::Mat<IMG_MAX_ROWS, IMG_MAX_COLS, HLS_8UC3> img_in(rows, cols);
	hls::Mat<IMG_MAX_ROWS, IMG_MAX_COLS, HLS_8UC3> img_out(rows, cols);

#pragma HLS dataflow

	hls::AXIvideo2Mat(video_in, img_in);
	overlyOnMat(img_in, img_out, pMem);
	hls::Mat2AXIvideo(img_out, video_out);
}

需要完整HLS代码的兄弟可以看完文章后再最后的福利章节得到源码的获取渠道;

4.OSD延时和资源占用情况

如下:
在这里插入图片描述

5.工程1:zynq7100实现字符叠加

开发板:zynq7100开发板;
开发环境:vivado2019.1;
输入:OV5640摄像头,输入分辨率1280X720;
输出:HDMI,输出分辨率1280X720;
工程BD如下:
在这里插入图片描述
代码架构如下:
在这里插入图片描述
SDK主函数代码如下:

#include "xiicps.h"
#include "xil_io.h"
#include "xparameters.h"
#include "helai_vdma.h"
#include "xoverlayosd.h"
#include "xil_cache.h"

XIicPs	Iic;
XOverlayosd overlayosdInstance;

#define X_PIXCEL 1280	//图像宽度
#define Y_PIXCEL 720	//图像高度
#define X_START 0		//字符起始x坐标
#define Y_START 0		//字符起始y坐标
#define OSD_COLOR       0xff000000	//osd字符颜色
#define OSD_BAKGROUND   0x00000000  //osd字符背景颜色
unsigned int overlayDomain[X_PIXCEL*Y_PIXCEL];
const char *showStr = "台湾一定要收复";	//字符

void main(){
	I2C_config_init();
	XOverlayosd_Initialize(&overlayosdInstance, XPAR_OVERLAYOSD_0_DEVICE_ID);
	XOverlayosd_Set_pMem(&overlayosdInstance, (u32)overlayDomain);
	XOverlayosd_EnableAutoRestart(&overlayosdInstance);
	XOverlayosd_Start(&overlayosdInstance);
	XOverlayosd_Set_overly_x(&overlayosdInstance, 0);
	XOverlayosd_Set_overly_y(&overlayosdInstance, 0);
	XOverlayosd_Set_overly_w(&overlayosdInstance, X_PIXCEL);
	XOverlayosd_Set_overly_h(&overlayosdInstance, Y_PIXCEL);
	XOverlayosd_Set_cols(&overlayosdInstance, X_PIXCEL);
	XOverlayosd_Set_rows(&overlayosdInstance, Y_PIXCEL);
	helai_vdma();
	while(1){
		int pos;
		pos = Y_START*X_PIXCEL+X_START;
		uArgbPrintf(showStr, overlayDomain+pos, X_PIXCEL, OSD_COLOR, OSD_BAKGROUND);
		Xil_DCacheFlushRange((INTPTR)overlayDomain, sizeof(overlayDomain));
		usleep(300000);
	}
}

OSD字符的颜色,显示位置,显示颜色等信息都可以在宏定义处修改,很方便;

6.上板调试验证

zynq7100开发板连接:
在这里插入图片描述
在图像左上角顶点输出黑色字符如下:
在这里插入图片描述
在图像左上角顶点输出蓝色字符如下:
在这里插入图片描述
在图像中部输出绿色不同字符如下:
在这里插入图片描述

7.福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料如下:获取方式:私,或者文章末尾的V名片。
在这里插入图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

9527华安

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

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

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

打赏作者

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

抵扣说明:

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

余额充值