コンテンツにスキップ

OSD(文字の重ね合わせ)

1.1. OSDの概要

一部のアプリケーションシナリオ(例:IPカメラ)では、画像に透かしを入れる要件があり、特に【日本語などのマルチバイト文字)の透かし】を描画する必要があります。しかし、OpenCV自体はデフォルトでこれらアジア言語の文字描画をサポートしていません。このような状況に対応するため、EASY EAI apiは、画像に文字を描画することに特化したフォントエンジンをカプセル化して提供しています。

1.1. OSDの概要 図10

1.1. OSDの概要 図10

1.2. クイックスタート

1.2.1 開発環境の準備

PC上のUbuntuシステムで runスクリプトを実行し、EASY-EAIコンパイル環境に入ります。詳細は以下の通りです。

Terminal window
cd ~/develop_environment
./run.sh 2204

1.2.2 ソースコードのダウンロードとサンプルのコンパイル

EASY-EAIコンパイル環境下で、ソースコードリポジトリを管理するディレクトリを作成します。

Terminal window
cd /opt
mkdir EASY-EAI-Toolkit
cd EASY-EAI-Toolkit
  • ダウンロードリンク: Demos.zip 上記のリンクから Demos.zip 圧縮ファイルをダウンロードし、仮想マシンの /opt/EASY-EAI-Toolkit ディレクトリにアップロードして解凍します。 対応するサンプルのディレクトリに移動し、コンパイル操作を実行します。具体的なコマンドは以下の通りです。
Terminal window
cd EASY-EAI-Toolkit-1126B/Demos/common-font_engine/
./build.sh cpres

💡 注意 : 依存ライブラリがボード上に配置されているため、クロスコンパイル中は必ず/mnt のマウントを維持してください。

1.2.2 ソースコードのダウンロードとサンプルのコンパイル 図12

1.2.2 ソースコードのダウンロードとサンプルのコンパイル 図12

1.2.3 サンプルの実行

シリアルデバッグまたはSSHデバッグを通じてボードのバックグラウンドに入り、サンプルが配置されている場所に移動します。以下の通りです。

Terminal window
cd /userdata/Demo/common-font_engine

1.2.3 サンプルの実行 図13

1.2.3 サンプルの実行 図13

サンプルの実行コマンドは以下の通りです。

Terminal window
./test-font_engine

1.2.4 実行結果

実行結果は以下のようになります。

テストプログラムを実行すると、「result.jpg」という名前の画像が生成されます

1.2.4 実行結果 図14

1.2.4 実行結果 図14

【コンパイルウィンドウ】に戻り、eog コマンドを使用して直接画像を開きます。

Terminal window
eog /mnt/userdata/Demo/common-font_engine/result.jpg &
eog /mnt/userdata/Demo/common-font_engine/testPic.png &

1.2.4 実行結果 図15

1.2.4 実行結果 図15

これにより、元の画像の上にが重ね合わされていることを確認できます。 もし EASY-EAI コンパイル環境で eogコマンドが見つからないというプロンプトが出た場合は、以下の操作でインストールしてください。

Terminal window
sudo apt-get update
sudo apt-get install eog

または、画像をボードからPCにコピーすることも可能です。

Terminal window
cp /mnt/userdata/Demo/common-font_engine/result.jpg ./Release

APIの詳細な説明、およびAPIの呼び出し(本サンプルのソースコード)については、以下の説明を参照してください。

1.3. 文字列操作APIの説明

1.3.1 インクルード/参照方法

EASY EAI api ライブラリは、本リポジトリの easyeai-apiディレクトリにあります。お客様がローカルプロジェクトで EASY EAI apiライブラリを直接呼び出せるように、プロジェクト内でリンクする必要があるライブラリやヘッダーファイル等を以下にリストアップしています。

説明CMakeでの記述Makefileでの記述
api.cmake${common_root}/font_engine/api.cmake無し
ヘッダーファイルディレクトリ${FONT_ENGINE_INCLUDE_DIRS}-I ../../easyeai-api/common/font_engine
ソースファイルディレクトリ${FONT_ENGINE_SOURCE_DIRS}../../easyeai-api/common/font_engine
ライブラリファイルディレクトリ無し無し
ライブラリリンクパラメータ${FONT_ENGINE_LIBS}無し

APIソースコードのパスはEASY-EAI-Toolkit-1126B/easyeai-api/common/font_engine/です。ユーザーはソースコードを通じてインターフェースの実装を確認でき、ソースコードを直接変更することも可能です。

1.3.2 グローバルフォントオブジェクトの作成

関数のプロトタイプは以下の通りです。

int32_t global_font_create(const char \*fontLib, const char \*codec);

具体的な説明は以下の通りです。

関数名:global_font_create()詳細
ヘッダーファイルeasyeai-api/common/font_engine/font_engine.h
入力パラメータfontLib:読み込むフォントライブラリファイル(例:”./simhei.ttf”)
codec:画像に書き込む文字の文字エンコーディング形式(例:utf-8 または
gbk など)
戻り値作成成功:0
作成失敗:-1
注意事項現在のプロセスで既にグローバル文字オブジェクトが作成されている場合、再度呼び出しても必ず
-1 が返されます。

1.3.3 グローバルフォントオブジェクトの文字エンコーディング設定

関数のプロトタイプは以下の通りです。

int32_t global_font_set_textCodec(const char \*codec);

具体的な説明は以下の通りです。

関数名:global_font_set_textCodec()詳細
ヘッダーファイルeasyeai-api/common/font_engine/font_engine.h
入力パラメータcodec:画像に書き込む文字の文字エンコーディング形式(例:utf-8
または gbk など)
戻り値設定成功:0
設定失敗:-1
注意事項事前にグローバルフォントオブジェクトが作成されている必要があります。

1.3.4 グローバルフォントオブジェクトのフォントサイズ設定

関数のプロトタイプは以下の通りです。

int32_t global_font_set_fontSize(uint32_t fontSize);

具体的な説明は以下の通りです。

関数名:global_font_set_fontSize()詳細
ヘッダーファイルeasyeai-api/common/font_engine/font_engine.h
入力パラメータfontSize:設定する目標のフォントサイズ
戻り値設定成功:0
設定失敗:-1
注意事項事前にグローバルフォントオブジェクトが作成されている必要があります。

1.3.5 画像に指定した文字を書き込む

関数のプロトタイプは以下の通りです。

int32_t putText(uint8_t \*imgData, uint32_t imgWidth, uint32_t imgHeight, const char \*text, uint32_t posX, uint32_t posY, FontColor color);

具体的な説明は以下の通りです。

関数名:putText()詳細
ヘッダーファイルeasyeai-api/common/font_engine/font_engine.h
入力パラメータimgData:画像データの先頭アドレス。データ形式はBGR888です。
imgWidth:画像の解像度サイズ(幅)。
imgHeight:画像の解像度サイズ(高さ)。
text:書き込む文字列。
posX:書き込む文字列の左上角のX座標(画像に対する相対位置)。画像の座標原点は左上角です。
posY:書き込む文字列の左上角のY座標(画像に対する相対位置)。画像の座標原点は左上角です。
color:フォントの色値。構造体については後述します。
戻り値書き込み成功:0
書き込み失敗:-1
注意事項事前にグローバルフォントオブジェクトが作成されている必要があります。

FontColor 構造体:

typedef struct {
uint8_t Alpha; // 透明度(アルファ)チャンネルの色値
uint8_t Red; // 赤色チャンネルの色値
uint8_t Green; // 緑色チャンネルの色値
uint8_t Bule; // 青色チャンネルの色値 (※原文ママ)
} FontColor;

1.3.6 グローバルフォントオブジェクトの破棄

関数のプロトタイプは以下の通りです。

int32_t global_font_destory();

具体的な説明は以下の通りです。

関数名:global_font_destory()詳細
ヘッダーファイルeasyeai-api/common/font_engine/font_engine.h
入力パラメータ無し
戻り値破棄成功:0
破棄失敗:-1
注意事項事前にグローバルフォントオブジェクトが作成されている必要があります。

1.4. APIテストケース

サンプルコードのパスは EASY-EAI-Toolkit-1126B/Demos/common-font_engine/test-font_engine.cppです。

以下は各APIの実際の使用例です。

int main(void){
// フォントの透明度と色を初期化
FontColor color = {200, 135, 189, 67}; // {A, R, G, B};
// グローバルフォントを作成
global_font_create("./simhei.ttf", CODE_UTF8);
// 背景画像を読み込む
cv::Mat img = cv::imread("./testPic.png");
// 文字を書き込む
global_font_set_fontSize(80);
putText(img.data, img.cols, img.rows, "欢迎使用", 210, 940,
color);
global_font_set_fontSize(40);
putText(img.data, img.cols, img.rows, "欢迎使用", 290, 1020,
color);
// 文字を書き込んだ後の画像を保存する
cv::imwrite("./res.jpg", img);
// グローバルフォントを破棄する
global_font_destory();
return 0;
}