【海思】图像视频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

相关文章

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

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

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