对视频图像进行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绘制一个的一个 “一”
 
对应的二进制代码:
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 */
}
}
}

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Delphi是一种高级集成开发环境和编程语言,可以用来开发Windows平台上的应用程序。在Delphi中,可以使用多种技术实现视频叠加OSD(On-Screen Display)。 视频叠加OSD是指在视频播放过程中,在视频画面上显示文本、图像或其他元素。要实现视频叠加OSD,首先需要加载视频文件,可以使用Delphi中的视频组件,如TMediaPlayer或TVideoGrabber。这些组件提供了对视频的操作和控制功能。 然后,可以使用画布(Canvas)对象来实现OSD的绘制。通过在画布上绘制文本、图像或形状,可以在视频画面上显示所需的OSD内容。在Delphi中,可以使用TPaintBox、TImage或TShape等组件来创建画布。 为了实现视频叠加OSD的持续更新,可以在视频播放过程中的每一帧画面上动态绘制OSD内容。在每一帧画面绘制之前,可以使用Canvas清空旧的OSD内容,并根据需要重新绘制更新的OSD内容。 为了控制OSD显示的位置、大小、颜色等属性,可以使用Delphi提供的画布绘制方法和属性。例如,可以使用Canvas.TextOut方法在指定位置绘制文本,使用Canvas.Draw方法在指定位置绘制图像。 此外,还可以通过调整画布的透明度(Alpha通道)来实现OSD的透明效果,使其与视频画面更好地融合。 在完成OSD绘制后,通过将画布绘制到视频画面上,实现视频叠加OSD效果。可以使用TPaintBox的OnPaint事件或TImage的OnPaint事件,在每一帧画面绘制完毕后,将画布内容绘制到视频组件的画面上。 通过以上步骤,就可以在Delphi中实现视频叠加OSD。这样,我们可以在视频播放过程中显示自定义的文本、图像或其他元素,增强视频的交互性和可视化效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值