对视频图像进行OSD叠加

    频叠加就是将图片和文字信息叠加到视频信号中,如电视台的LOGO,电影的字幕,电视机的菜单,都是通过视频叠加的形式显示在视频图像中的。区别于用于专业影视编辑行业的字幕叠加器,字符叠加器这一名称现在更加习惯用于各类监控系统中使用的价格相对低廉的具备基本的视频字幕叠加能力的电子设备。 
    字符叠加器按照功能分型可分为 动态字符叠加器 静态字符叠加器  
    动态字符叠加器指与微机或其他智能设备配合,可显示随现场情况变化的字 符信 息,字符信息与现场视频信号相结合,为监控者提供更为详尽准确的信息。 

    静态字符叠加器指只在视频信号上显示相对固定字符信息的设备,主要用于在视频信号上叠加摄像头位置信息。价格低廉是此类静态字符叠加器的特点之一。

    接下来给大家介绍我在hi3516的平台实现的OSD叠加的测试代码,我选择在VI通道进行osd叠加,具体的初始化操作和通道的配置会在下一篇文件会介绍,本文给大家介绍的是通过自己设置一个汉字模或者ASSIC模,然后通过二进制表示,最后读取字模并绘制在相应的图像区域,经过编码后即可显示叠加的内容。

    先来了解一下字库的表示格式  

一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。
   因此,汉字在汉字库中的具体位置计算公式为: 94*(区号-1)+位号-1 。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。
以16*16点阵字库为例,
计算公式则为:(94*(区号-1)+(位号-1))*32。汉字库文该从该位置起的32字节信息即记录了该字的字模信息。
以32*32点阵字库为例,
计算公式则为:(94*(区号-1)+(位号-1))*128。汉字库文该从该位置起的128字节信息即记录了该字的字模信息。

先来看一个32为的字模 自己也可以通过excel绘制一个的一个 “一”
对视频图像进行OSD叠加_第1张图片
 
对应的二进制代码:
unsigned char ZT[128] =
{
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,

0x07, 0xFF,0xFF, 0x00,
0x07, 0xFF,0xFF, 0x00,
0x07, 0xFF,0xFF, 0x00,
0x07, 0xFF,0xFF, 0x00,
0x07, 0xFF,0xFF, 0x00,
0x07, 0xFF,0xFF, 0x00,
0x07, 0xFF,0xFF, 0x00,
0x07, 0xFF,0xFF, 0x00,
0x07, 0xFF,0xFF, 0x00,

0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00,
0x00, 0x00,0x00, 0x00
};
取字模
memcpy(p, &ZT, 128); //测试使用

把取出来分字模绘制成对应的位图
static inline void do_blit(char *p, char *origin, unsigned int BitbmpPix_X, int x, int y, int font)
{
char *pixel;
int row, col;
int y_next = y;
int j,k;
if(font == hz_font)
{
for(row = 0; row < 32; row++)
{
pixel = origin + (BitbmpPix_X * 2 * (y_next)) + x;
for(j = 0; j < 4; j++)
{
for(col = 0; col < 8; col++)
{
if(bitmap[row*4+j] &(0x80 >> col))
{
pixel[(col+j*8)*2] = 0x7f;
pixel[(col+j*8)*2+1] = 0xff;
}
else
{
pixel[(col+j*8)*2] = 0x00;
pixel[(col+j*8)*2+1] = 0x00;
}
}
}
y_next++; /* Next line in bitmap */
}
}
else
{
for(row = 0; row < 32; row++)
{
pixel = origin + (BitbmpPix_X * 2 * (y_next)) + x;
for(k = 0;k < 2;k++)
{
for(col = 0; col < 8; col++)
{
if(bitmap[row*2+k] &(0x80 >> col))
{
pixel[(col+k*8)*2] = 0x7f;
pixel[(col+k*8)*2+1] = 0xff;
}
else
{
pixel[(col+k*8)*2] = 0x00;
pixel[(col+k*8)*2+1] = 0x00;
}
}
}
y_next++; /* Next line in bitmap */
}
}
}

你可能感兴趣的:(海思开发,视频,图像处理)