米联客 ZYNQ/SOC 精品教程 S02-CH25 利用OSD实现双目摄像头字幕叠加

本文介绍了如何在米联客ZYNQ开发板上,利用OSD功能实现双目摄像头图像采集系统,并通过VDMA设置和OSD驱动设计,完成字幕叠加功能。详细讲解了FPGA BD工程的配置,包括摄像头电路、VTC、VDMA、OSD等模块,并提供了软件部分的IIC协议、OSD驱动和VDMA配置设计。

软件版本:VIVADO2017.4

操作系统:WIN10 64bit

硬件平台:适用米联客 ZYNQ系列开发板

米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!

25.1 概述

      本课使用MT9V034搭建两路基于VDMA的摄像头图形采集系统,并对OSD实现字幕叠加功能说明。提供的代码也包含MT9V034、OV5640摄像头双目例程,实现过程大同小异,这里不做过多讲解。

25.2 双目图像采集传输系统架构图

7a8eaf0216cac5899fef40410595689f2bf.jpg

25.3 FPGA BD工程

25.3.1 摄像头电路设计

     本课使用两个MT9V034摄像头(配套的代码也给出了2路OV5640摄像头OSD方案),每路摄像头输出分辨率640*480。摄像头部分电路设计如下所示:

01d46947885ee5d18894e8529af3cec7f25.jpg 

25.3.2 Vid_in IP电路搭建

        MT9V034的vid_ce信号始终接电平。这里给出MT9V034部分电路设计:

3d25b644e3c4eefd7981b63d4fff558fb0c.jpg 

25.3.3 VDMA设置

b0cbd3b66272c3ac6ce2c4a916ccf9898da.jpg95a2db26f966d5a3632da753944af0a8f3d.jpg

25.3.4 OSD设置

本章要使用OSD完成字幕的叠加功能,所以要开启AXI-lite控制接口。OSD配置如下所示:

a6cf784f25753da7e80929aeb292dbb84af.jpg281078f66bdc9f9ec9b36fffb9302986e39.jpg

LAYER2和LAYER3层设置

6b86d912d7ce23427ce1523b55d3f5fdd8f.jpg

      上面第一副图中,我们勾选了控制接口,开启了4个Layer,最大输出设置为了1280。至于为什么使用4个layer,这是因为要完成2路视频拼接和2路字幕叠加。另外最后2个layer就是字幕叠加层,所以将其设置为了Internal Graphics Controllers。第二副图是对各个层进行显示的设置,大家也可以修改这一部分的设置来完成各个图层的显示位置,功能也不仅仅局限于拼接视频,也可以完成画中画的功能,OSD是个功能很强大的IP!设置完这两部分之后,在LAYER2、3设置ASCII Offset为0,否则后面设置字符串会发生错位,其余的配置按默认即可。

25.3.5 PLL时钟设置

      PLL时钟的设置取决于分辨率大小的设置,本节采用的是720P输出,因此PLL时钟设置如下:

7fd1e81e1a2b0feaff2bd29691aa69855b6.jpg

25.3.6 VTC设置

326a2232a8fb024b6ef6f184cef4ad3f713.jpg

25.3.7 AXI IIC设置

     本节课要使用2路摄像头进行采集,需要两路IIC配置对摄像头寄存器进行配置。

03d7efdc5de74ea93d9b1d25c1c35b0a2d1.jpg

此部分的设置如下图所示:

4429532111a86b4574054e82aeccae47142.jpg

      其余选项的设置参考之前历程的设置即可。

25.4 软件部分设计

     软件部分主要可以分为三块,IIC协议实现、OSD驱动与VDMA配置。下面分别对这三个部分进行介绍。

25.4.1 IIC实现

     本课节当中要对两个摄像头进行寄存器配置,如下图所示:

 de4411b9b3df2cd81c5da21689932ca453b.jpg

在main.c中可以看到摄像头IIC初始化配置函数。

d29975991bbef9fc4b778c31807c365da80.jpg  

在I2C_8bit.c文件中,找到I2C_config_init()配置函数。

ea2fc7fde30920673e10ab6bc632daaf38a.jpg

其中,在I2C_8bit.c中可以查找到mt9v034_config_table[]与I2C_write相关定义。

相关定义mt9v034_config_table[]

09fcbaf9598e1ee5b77d30f351a164d3894.jpg

       其中write_i2c是ov5640的iic配置程序,write_i2c_mt是MT9V034的iic配置程序,程序的主要设计思想就是使用一个数字来存放要配置的寄存器地址和数据。

25.4.2 OSD驱动设计

      OSD驱动部分主要由osd.c与osd.h组成。程序由官方驱动重新封装,此处重点介绍osd.c。OSD驱动如下表所示:

 

 

#include "xbasic_types.h"

#include "xparameters.h"

#include "xstatus.h"

#include "osd.h"

#include "xosd.h"

#include "stdio.h"

 

 

/*

 * Device related constants. Defined in xparameters.h

 */

#define OSD_DEVICE_ID     XPAR_OSD_0_DEVICE_ID

 

/*

 * OSD Device related data structures

 */

XOSD Osd;                    /* OSD Device driver instance */

XOSD_Config *OsdCfgPtr;      /* OSD device configuration pointer */

 

/*

 * Color table definition

 */

u32 ColorData[16] = {

    0x00000000, 0xa0a25f58, 0xa08080ff, 0xa0808010,

    0xa0ef5a51, 0x00000000, 0xa0465289, 0x00000000,

    0xa065ba6b, 0x00000000, 0xa09017c5, 0xa0a9c860,

    0xa0bc3198, 0xa010a5a9, 0xa0808080, 0xa0ada1ab

};

 

/*

 * Text table definition

 */

char __attribute__ ((aligned (4))) TextData[8][32] = {

    "OV5640", //"String #1",

    "OV7725",                       //"String #2",

    "MT9V034 CAMER TEST",

"www.osrc.cn"

    "Xilinx",

    "String #5",

    "String #6",

    "String #7"

   // "String #8"

};

 

/*

 * Font definition

 */

unsigned char __attribute__ ((aligned (4))) Font[128][8] = {

    {0x00, 0x36, 0x7F, 0x7F, 0x3E, 0x1C, 0x08, 0x00}, // NULL

    {0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x18},

    {0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03},

    {0x18, 0x18, 0x18, 0xF8, 0xF8, 0x00, 0x00, 0x00},

    {0x18, 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, 0x18},

    {0x00, 0x00, 0x00, 0xF8, 0xF8, 0x18, 0x18, 0x18},

    {0x03, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xC0},

    {0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03},

    {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF},

    {0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F},

    {0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF},

    {0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00},

    {0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00},

    {0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},

    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF},

    {0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0},

    {0x00, 0x1C, 0x1C, 0x77, 0x77, 0x08, 0x1C, 0x00},

    {0x00, 0x00, 0x00, 0x1F, 0x1F, 0x18, 0x18, 0x18},

    {0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00},

    {0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18},

    {0x00, 0x00, 0x3C, 0x7E, 0x7E, 0x7E, 0x3C, 0x00},

    {0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF},

    {0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0},

    {0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x18, 0x18},

    {0x18, 0x18, 0x18, 0xFF, 0xFF, 0x00, 0x00, 0x00},

    {0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0},

    {0x18, 0x18, 0x18, 0x1F, 0x1F, 0x00, 0x00, 0x00},

    {0x78, 0x60, 0x78, 0x60, 0x7E, 0x18, 0x1E, 0x00},

    {0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x00},

    {0x00, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00},

    {0x00, 0x18, 0x30, 0x7E, 0x30, 0x18, 0x00, 0x00},

    {0x00, 0x18, 0x0C, 0x7E, 0x0C, 0x18, 0x00, 0x00},

 

    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Space

    {0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00},

    {0x00, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00},

    {0x00, 0x66, 0xFF, 0x66, 0x66, 0xFF, 0x66, 0x00},

    {0x18, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x18, 0x00},

    {0x00, 0x66, 0x6C, 0x18, 0x30, 0x66, 0x46, 0x00},

    {0x1C, 0x36, 0x1C, 0x38, 0x6F, 0x66, 0x3B, 0x00},

    {0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00},

    {0x00, 0x0E, 0x1C, 0x18, 0x18, 0x1C, 0x0E, 0x00},

    {0x00, 0x70, 0x38, 0x18, 0x18, 0x38, 0x70, 0x00},

    {0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00},

    {0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00},

    {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30},

    {0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00},

    {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00},

    {0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00},// /

    {0x00, 0x3C, 0x66, 0x6E, 0x76, 0x66, 0x3C, 0x00},// 0

    {0x00, 0x18, 0x38, 0x18, 0x18, 0x18, 0x7E, 0x00},//1

    {0x00, 0x3C, 0x66, 0x0C, 0x18, 0x30, 0x7E, 0x00},//2

    {0x00, 0x7E, 0x0C, 0x18, 0x0C, 0x66, 0x3C, 0x00},

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值