【海思】图像视频OSD准备——移植freetype、SDL、SDL_ttf到开发板

2024-01-26 08:18

本文主要是介绍【海思】图像视频OSD准备——移植freetype、SDL、SDL_ttf到开发板,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、freetype的下载、编译
    • 二、SDL的下载、编译
    • 三、SDL_ttf的下载、编译
    • 四、运行测试程序
    • ————2020-06-04更新————

在图像视频监控中,需要在画面中增加监控地点、时间戳等水印,通过我之前写的 【opencv交叉编译移植到linux-arm开发板,并做测试】已经可以利用opencv方便的将时间戳打到抓拍的图像上。使用opencv打水印虽然简单方便,但存在两个缺点:
1.putText不可放置中文;
2.应用在视频OSD显然是不方便的,因为海思的region区域管理通常以bmp位图叠加的方式进行OSD,通过阅读官方SDK例程的sample_region源码可以看出,其例程是读入已有的bmp文件叠加在视频流中,例程中bmp是死的,是不会变化的。
而实际应用场景中需要生成变化的OSD并打到图像或视频流中,那么我们可以通过【将字符串生成位图,再叠加到图像视频】实现。
通过阅读大神的博客 【海思多媒体(MPP)开发(5)——区域管理(REGION&OSD字符显示)】,可见实现【字符串生成位图】需要使用并移植以下三个工具
1.freetype
2.SDL
3.SDL_ttf

目标明确后,开始着手移植吧。

一、freetype的下载、编译

1.下载freetype源码
http://mirror.yongbok.net/nongnu/freetype/,我下的是2.7.1版本,下载后解压得到文件夹freetype-2.7.1
2.编译安装
这里我们依旧使用cmake-gui进行交叉编译。需要注意的是CMAKE_INSTALL_PREFIX选项,选一个路径,并记住这个路径。这里我选择的是/usr/local路径。
cmake配置好后一次进行make、make install,完成后交叉编译的freetype头文件、库文件夹就分别在/usr/local/include /usr/local/lib中了。

二、SDL的下载、编译

1.下载SDL源码
http://www.libsdl.org/download-1.2.php
下载的是SDL-1.2.15.tar.gz,解压得到SDL-1.2.15文件夹,进入文件夹。
2.编译安装
进入之后进行编译配置

./configure --prefix=/opt/arm --disable-pulseaudio --disable-video-nanox -disable-video-qtopia --disable-static --enable-shared --disable-video-photon --disable-video-ggi --disable-video-svga --disable-video-aalib --disable-video-dummy --disable-video-dga --disable-arts --disable-esd --disable-alsa --disable-video-x11 --disable-nasm --disable-joystick --disable-input-tslib -enable-video-fbcon --host=arm-himix200-linux

注意最后的 --host= 后填你的交叉编译链。配置成功后再进行make、make install,完成后SDL的相关头文件、库就被安装到–prefix=指明的/opt/arm中去了。

三、SDL_ttf的下载、编译

1.下载SDL_ttf源码
http://www.libsdl.org/projects/SDL_ttf/release/
下载的是SDL_ttf-2.0.11.tar.gz,解压得到SDL_ttf-2.0.11文件夹,进入。
2.编译安装
进行编译配置,需要注意的就是配置交叉编译链、配置安装目录、配置之前安装的freetype、SDL目录,以及freetype、SDL对应的库文件目录。因为SDL_ttf的编译依赖于SDL和freetype。

./configure --host=arm-himix200-linux -prefix=/opt/arm --with-sdl-prefix=/opt/arm --with-freetype-prefix=/usr.local --without-x LDFLAGS=”-L/usr/local/lib  -L/opt/arm/lib -lSDL -lfreetype”

配置完成后进行make、make install。需要注意的是make过程中可能提示xxxx头文件找不到的情况,解决办法有两个:1.在上述配置代码中加入头文件的路径;2.在Makefile里直接加入头文件的路径。两种方法都可以。

四、运行测试程序

测试程序的最终目的就是将字符串转换为bmp位图,并且能运行在arm平台上。借鉴前辈【海思多媒体(MPP)开发(5)——区域管理(REGION&OSD字符显示)】的代码并做简单修改,如下。功能是生成几张时间位图,字符串中包含了中文、英文和符号,证明了生成位图的完整性。

test.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "SDL.h"
#include "SDL_ttf.h"
#include "time.h"#define FONT_PATH       "./UbuntuMono-BI.ttf"
int string_to_bmp(char *pu8Str);
int cnt = 0;
int main()
{time_t now;struct tm *ptm;char timestr[100] = {0};while(1){usleep(1000000);time(&now);ptm = localtime(&now);snprintf(timestr,100,"时间%d-%02d-%02d %02d:%02d:%02d",ptm->tm_year+1900,ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);string_to_bmp(timestr);memset(timestr,0,100);if(cnt++ > 5){break;}}return 0;
}int string_to_bmp(char *pu8Str)
{SDL_PixelFormat *fmt;TTF_Font *font;  SDL_Surface *text, *temp;  if (TTF_Init() < 0 ) {  fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());  SDL_Quit();}  font = TTF_OpenFont(FONT_PATH, 80); if ( font == NULL ) {  fprintf(stderr, "Couldn't load %d pt font from %s: %s\n",18,"ptsize", SDL_GetError());  }  SDL_Color forecol = { 0xff, 0xff, 0xff, 0xff };  text = TTF_RenderUTF8_Solid(font, pu8Str, forecol);fmt = (SDL_PixelFormat*)malloc(sizeof(SDL_PixelFormat));memset(fmt,0,sizeof(SDL_PixelFormat));fmt->BitsPerPixel = 16;fmt->BytesPerPixel = 2;fmt->colorkey = 0xffffffff;fmt->alpha = 0xff;temp = SDL_ConvertSurface(text,fmt,0);char savename[10] = {0};snprintf(savename,10,"%d.bmp",cnt);printf("savename = %s\n",savename);SDL_SaveBMP(temp, savename); SDL_FreeSurface(text);  SDL_FreeSurface(temp);TTF_CloseFont(font);  TTF_Quit();  return 0;
}

交叉编译命令为

arm-himix200-linux-gcc test.c -I/opt/arm/include/SDL -L/opt/arm/lib -lSDL -lSDL_ttf -lpthread

可以看出使用了动态链接库,故将编译好的可执行文件复制到开发板后,还需要复制所需的so库文件到开发板的/lib目录下。可以先运行以下,缺哪个库就复制哪个库,都在之前交叉编译的SDL、SDL_ttf的lib目录下。
程序运行结果如下

/user/sdl # ./a.out 
savename = 0.bmp
savename = 1.bmp
savename = 2.bmp
savename = 3.bmp
savename = 4.bmp
savename = 5.bmp
savename = 6.bmp

运行完后看一下运行目录,已经生成了0~6张位图

/user/sdl # ls
0.bmp              3.bmp              6.bmp
1.bmp              4.bmp              UbuntuMono-BI.ttf
2.bmp              5.bmp              a.out

将位图复制到ubuntu下,可以看到与预期相符。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
如此一来,就可以使用opencv,或者海思的region区域管理给图像视频添加任意水印OSD了。

————2020-06-04更新————

上述是从别人的例程那赋值粘贴而来,后来代码审核发现内存泄漏问题,原因很简单——fmt没有free。

这篇关于【海思】图像视频OSD准备——移植freetype、SDL、SDL_ttf到开发板的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/646171

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

树莓派5_opencv笔记27:Opencv录制视频(无声音)

今日继续学习树莓派5 8G:(Raspberry Pi,简称RPi或RasPi)  本人所用树莓派5 装载的系统与版本如下:  版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下: 今天就水一篇文章,用树莓派摄像头,Opencv录制一段视频保存在指定目录... 文章提供测试代码讲解,整体代码贴出、测试效果图 目录 阶段一:录制一段

基于树梅派的视频监控机器人Verybot

最近这段时间做了一个基于树梅派 ( raspberry pi ) 的视频监控机器人平台 Verybot ,现在打算把这个机器人的一些图片、视频、设计思路进行公开,并且希望跟大家一起研究相关的各种问题,下面是两张机器人的照片:         图片1:                   图片2                    这个平台的基本组成是:

PC与android平板通过浏览器监控Verybot的视频

下面这个视频是PC与android平板通过浏览器监控Verybot的视频:           http://v.youku.com/v_show/id_XNjYzNzYyMTIw.html

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采