• 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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    需要完整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);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

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

    6.上板调试验证

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

    7.福利:工程源码获取

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

  • 相关阅读:
    【职场必备知识】毕业留蓉政策与发展前景分析
    基于ESP32设计可以通过 WiFi 控制的基于 ESP32 的定制四轴飞行器
    Mockito使用问题记录
    怎么在Qt中使用AIUI
    大数据导论 四、JDK安装部署
    Navigation 组件(一) Fragment 跳转
    SpringMvc如何向Session域中设置数据
    Docker基本管理
    文献阅读1
    M的编程备忘录之C++——入门
  • 原文地址:https://blog.csdn.net/qq_41667729/article/details/128102885