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

相关文章

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

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

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

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

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