KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
OpenCVで使われるputtextとは?コードを交えて徹底解説!?

OpenCVで使われるputtextとは?コードを交えて徹底解説!?

今回はOpenCVで使われるputtextに関して、コードを交えて徹底解説いたします。puttextを使ってみたい、OpenCV初学者の方はおすすめです。ぜひ最後までご一読ください。

目次
  1. OpenCVで使われるputtextとは?
  2. OpenCVで使われるputtext関数の定義
    1. 画像へ日本語の文字列を挿入したい場合
    2. 改行文字を持つ文字列を画像へ挿入したい場合
  3. まとめ
  4. 参考文献

OpenCVで使われるputtextとは?

OpenCVで使われるputtextとは、画像へ文字列を印字する場合に利用する関数を意味します。

具体的なイメージとしては、以下の画像の水色枠で描画される文字列を、印字するために利用する関数と考えると良いでしょう。

OpenCVで使われるputtext関数の定義

puttext関数は、

1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# 第一引数 : 画像情報(numpy.ndarray型)
5####################################
6
7# 第二引数以降 : option1, option2, ...
8
9# <以下必須option>
10# org : 文字列を画像のどの位置へ挿入するのか指定する。文字列の左下角を基準にして、(x座標(int型), y座標(int型))で指定する。
11# 例) org=(10, 15) : 文字列の左下角を基準にして、x座標10px, y座標15pxの位置へ文字列を挿入する。
12
13# text : 画像へ挿入する文字列を指定する。string型。
14# ※ 日本語と全角記号の文字列は、「???」に変換されます。英数字 + 半角記号のみで文字列指定しましょう。
15# 日本語の文字列を利用したい場合は、同記事「画像へ日本語の文字列を挿入したい場合」の見出し箇所を参照ください。
16# 例) text="hogehoge" : 画像へ挿入する文字列を'hogehoge'とする。
17
18# fontFace : 画像へ挿入する文字列の、フォントの種類を指定します。フォントの種類に関しては、以下の公式ドキュメントをご確認ください。
19# 公式ドキュメント : https://docs.opencv.org/3.4.0/d0/de1/group__core.html#ga0f9314ea6e35f99bb23f29567fc16e11
20# 例) fontFace=cv.FONT_HERSHEY_SIMPLEX : 文字サイズを普通にして、sans-serifフォントを利用する。
21# sans-serifとは? : https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%B3%E3%82%BB%E3%83%AA%E3%83%95
22# フォントとは? : https://www.weblio.jp/content/%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88
23
24# fontScale : 画像へ挿入する文字列の大きさを、倍率指定して変更します。float型。
25# 例) fontScale=1.2 : 画像へ挿入する文字列の大きさを、元の文字列の1.2倍の大きさに変更する。
26
27# color : 画像へ挿入する文字列の色を指定します。指定方法はBGR形式(B(Blue), G(Green), R(Red))になります。
28# 例) color=(0, 255, 0) : 画像へ挿入する文字列の色を緑色に指定する。
29# 以下のサイトを利用して、文字列の色指定を考えると良いでしょう。
30# https://www.peko-step.com/tool/tfcolor.html
31
32# <以下任意option>
33# thickness : 画像へ挿入する文字列の太さを指定します。int型。
34# 指定しない場合、デフォルトで1が設定されます。
35# ※ thickness optionには0以上の整数を指定ください。負の数を指定すると、以下のエラーが表示されます。(0を指定すると1を指定した時と同じ挙動になります。)
36# : error: thickness >= 0 in function 'PolyLine'
37# 例) thickness=2 : 画像へ挿入する文字列の太さを2pxに変更する。
38
39# bottomLeftOrigin : 文字列の左下角を基準にして、画像へ文字列を挿入する場合、True(デフォルト)を指定する。文字列の左上角を基準にして、画像へ文字列を挿入する場合、Falseを指定する。boolean型。
40# 例) bottomLeftOrigin=False : 文字列の左上角を基準にして、画像へ文字列を挿入する。
41
42####################################
43
44# 戻り値 : 画像情報(numpy.ndarray型)
45cv2.puttext(img, option1, option2, ...)

で定義されます。

例えば以下のようなコードを作成すると、

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12    sys.exit("Could not read the image.")
13
14img = cv2.putText(
15    img, 
16    org=(100, 300), 
17    text='sample text', 
18    fontFace=cv2.FONT_HERSHEY_SIMPLEX, 
19    fontScale=1.0, 
20    color=(25, 25, 125), 
21    thickness=4
22)
23
24# imwrite : 画像の保存を行う関数
25# 第一引数 : 保存先の画像ファイル名
26# 第二引数 : 多次元配列(numpy.ndarray)
27# <第二引数の例>
28# [
29# [
30# [234 237 228]
31# ...
32# [202 209 194]
33# ]
34# [
35# [10 27 16]
36# ...
37# [36 67 46]
38# ]
39# [
40# [34 51 40]
41# ...
42# [50 81 60]
43# ]
44# ]
45# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
46cv2.imwrite('output.jpg', img)

以下の画像のように画像を描画します。

puttext関数を利用する前の元画像

puttext関数を利用して、画像へ文字列を挿入した場合の画像

imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。

imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。

画像へ日本語の文字列を挿入したい場合

画像へ日本の文字列を挿入したい場合は、PILライブラリを利用することで問題解決できます。

例えば以下のようなコードを作成すると、

1import numpy as np
2# PILライブラリを利用する。
3from PIL import Image, ImageDraw, ImageFont
4import cv2
5import sys
6
7# 画像へ文字列を挿入する関数
8# 参考 : https://watlab-blog.com/2019/08/25/image-text/
9def img_add_text(img, text):
10    # OSError: cannot open resourceのエラーが出た場合 : https://qiita.com/Afo_guard_enthusiast/items/60e21acc6259a58e7ff0
11    font_path = '/Library/Fonts//Arial Unicode.ttf'
12    font_size = 24
13
14    # PILライブラリを利用してフォントを定義する。
15    font = ImageFont.truetype(font_path, font_size) 
16    # cv2(numpy.ndarray)型の画像を、PILライブラリに合わせた型の画像へ変換する。
17    img = Image.fromarray(img) 
18    # 文字列を挿入するために、描画用のDraw関数を用意する。
19    draw = ImageDraw.Draw(img)
20    # 文字列を描画(位置, 文字列, フォント情報, 文字列色)する。
21    draw.text((50, 50), text, font=font, fill=(0, 255, 0))
22    
23    # PILライブラリに合わせた型の画像から、cv2(numpy.ndarray)型の画像へ変換する。
24    img = np.array(img)
25
26    return img
27
28# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
29# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
30# 第一引数 : 画像のファイルパス
31# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
32img = cv2.imread('xxx.xxx')
33
34# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
35if img is None:
36    sys.exit("Could not read the image.")
37
38img = img_add_text(img, 'こんにちは')
39
40# imwrite : 画像の保存を行う関数
41# 第一引数 : 保存先の画像ファイル名
42# 第二引数 : 多次元配列(numpy.ndarray)
43# <第二引数の例>
44# [
45# [
46# [234 237 228]
47# ...
48# [202 209 194]
49# ]
50# [
51# [10 27 16]
52# ...
53# [36 67 46]
54# ]
55# [
56# [34 51 40]
57# ...
58# [50 81 60]
59# ]
60# ]
61# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
62cv2.imwrite('output.jpg', img)

以下の画像のように画像を描画します。

PILライブラリを利用する前の元画像

PILライブラリを利用して、画像へ日本語の文字列を挿入した場合の画像

改行文字を持つ文字列を画像へ挿入したい場合

単純にputtext関数を利用して、画像へ改行文字を持つ文字列を挿入すると、改行されずに文字列が挿入されてしまいます。

画像へ改行されずに文字列が挿入される、イメージ画像

画像へ改行されずに文字列が挿入される問題を解決するためには、改行が現れる度に、文字列の挿入位置を変更すると、うまくいきます。

例えば以下のようなコードを作成すると、

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12    sys.exit("Could not read the image.")
13
14text = "ABCDEFG\nHIJKLMN\nOPQRSTU\nVWXYZ"
15# 参考 : https://note.nkmk.me/python-split-rsplit-splitlines-re/
16textList = text.split("\n")
17
18for i in range(len(textList)):
19    cv2.putText(
20        img,
21        text=textList[i],
22        org=(10, 100 + i * 22),
23        fontFace=cv2.FONT_HERSHEY_PLAIN,
24        fontScale=1.5,
25        color=(0, 255, 255)
26    )
27
28# imwrite : 画像の保存を行う関数
29# 第一引数 : 保存先の画像ファイル名
30# 第二引数 : 多次元配列(numpy.ndarray)
31# <第二引数の例>
32# [
33# [
34# [234 237 228]
35# ...
36# [202 209 194]
37# ]
38# [
39# [10 27 16]
40# ...
41# [36 67 46]
42# ]
43# [
44# [34 51 40]
45# ...
46# [50 81 60]
47# ]
48# ]
49# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
50cv2.imwrite('output.jpg', img)

以下の画像のように画像を描画します。

puttext関数を利用する前の元画像

puttext関数を利用して、画像へ文字列を挿入した場合の画像

まとめ

  • OpenCVで使われるputtextとは、画像へ文字列を印字する場合に利用する関数を意味する。
  • 画像へ日本語の文字列を挿入したい場合、PILライブラリを利用する。

参考文献