OpenCV/C++で画像処理入門 vol.4 〜画像に文字を書き込んでみよう〜

2019.01.18

 

こんにちは、代表の大野です。

 

OpenCV/C++で画像処理入門シリーズの第4回目です。

 

前回は、画像に図形を描画する処理を行いましたので
今回は、画像に文字を書き込む処理をやってみたいと思います。

 

環境があれば、ぜひみなさんも一緒に
プログラムを書いて体験してみてくださいね。

 

バックナンバー

vol1. 画像を表示してみよう
vol2. 画像を加工してみよう

vol3. 画像に図形を描画してみよう

 

今回やること

画像に文字を書き込んでみる

 

環境

マシン  :mac OS Mojave 10.14.1
言語   :C++
ライブラリ:OpenCV 3.4.3
コンパイラ:Clang / LLVM

 

準備 & 画像の用意

OpenCVのインストールなどは
バックナンバーなどから、参考にしてください。

 

今回のサンプルは
ティータイムスワワちゃんを用いることにします。

 

ティータイム スワワちゃん(teatimesuwawachan.jpg)
width : 600px
height : 600px

 

では、いってみましょう。

 

 

画像に文字を書き込んでみよう

ティータイムスワワちゃんは、
スワワちゃん画像シリーズの中でも
人気の高い画像になります。

 

このスワワちゃんに
少々しゃべらせるようなイメージで
文字を書き込めたら楽しいですよね?

 

 

さて、文字の書き込み位置には
やはり今回もcv::Pointを使うのですが、

 

座標の決め方は、以前ご紹介したcv::Rectと似ていますが、
文字を書き込む位置の「左下」の頂点座標を指定することになります。

 

cv::Rectは左上だったので、間違えないように気をつけましょう。

 

 

ということで、位置については、
スワワちゃんがしゃべってる感じにしたいので

 

(x, y) = (25, 75)

 

あたりを左下頂点座標としましょう。

 

 

 

とりあえず、プログラムを見てみることにします。

 

<ソースプログラム>

text.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <opencv2/opencv.hpp>

int main()
{
  cv::Mat img, dst;

  img = cv::imread("teatimesuwawachan.jpg");
  dst = img.clone();

  cv::putText(
    dst,
    "Tasty!",
    cv::Point(25,75),
    cv::FONT_HERSHEY_SIMPLEX,
    2.5,
    cv::Scalar(0,0,0),
    3
  );

  cv::imshow("input", img);
  cv::imshow("output", dst);

  cv::waitKey(0);

  return 0;
}

 

では、いつものごとく、プログラムについて説明していきます。

 

といっても、cv::putText()以外は、前回と全く同じなので説明は割愛します。

 

cv::putText()ですが、
その名の通り、画像の上に文字列を描画してくれるものになります。

 

 

引数を見てみましょう。
今回は、引数が多くなるため、
見やすいように、プログラム中には
引数一つずつにおいて、改行を入れてあります。

 

第一引数 dst … 出力先のcv::Mat
第二引数 “Tasty!” … 書き込む文字列
第三引数 cv::Point(25,75) … 文字列始点の左下座標
第四引数 cv::FONT_HERSHEY_SIMPLEX … フォント
第五引数 2.5 … 文字列の大きさスケール
第六引数 cv::Scalar(0,0,0) … 文字列の色(BGR指定)
第七引数 3 … 文字列の太さ

 

 

第一引数は、いつもの通りdstです。

 

第二引数に文字列を入れます。
” “(ダブルクォーテーション)で囲むのを忘れないようにしましょう。

 

第三引数は、文字列を書き込む場所の始点となる左下の座標です。

 

第四引数でフォントを指定するんですが、
残念ながら執筆時点で日本語を描画できるフォントはなさそうです。

 

 

本当は

 

「やっぱり紅茶は、アールグレイに限りまスワ♪」

 

あたりを書き込みたかったんですが残念です。

 

今回はよく使われるスタンダードなcv::FONT_HERSHEY_SIMPLEX にしました。
その他のフォントは、このあたりを参照してください。

https://docs.opencv.org/4.0.0/d6/d6e/group__imgproc__draw.html

 

第五引数には、文字列の大きさを指定するものだと思ってください。

 

第六引数、第七引数は、過去に説明済みでもある
色の指定と、太さの指定です。

 

 

では、実際にビルド&実行です。

 

<ビルド & 実行>

ターミナルなど

1
2
c++ $(pkg-config --cflags --libs opencv) text.cpp
./a.out

 


 

ちゃんと画像の左上に「Tasty!」という文字が
書き込まれましたね。

 

 

まとめ

日本語表示は、外部からフォントを持ってきて
読ませるなどして、できるようなんですが、

 

このブログは、一応入門編ということで
まずは、スタンダードな文字の書き込みをご紹介しました。

 

 

みなさんも、好きな文字を書き込んで
ぜひ遊んでみてください。

 

 

今日はここまで。

 

 

OpenCV/C++で画像処理入門シリーズ

vol1. 画像を表示してみよう
vol2. 画像を加工してみよう

vol3. 画像に図形を描画してみよう

vol4. 画像に文字を書き込んでみよう

vol5. 画像を行列にしてみよう①

 


Top