【OpenCV-Python】getTextSize(文字の大きさを調べる)

OpenCVで描画する文字の大きさを調べるにはgetTextSize()関数を用います。

文字を描画するputText()関数では、文字を描画する位置を文字の左下の位置で指定しますが、文字の位置を上寄せ、下寄せ、右寄せ、左寄せ、左寄せなどを行いたい場合は、描画する文字の領域を調べ、描画位置を補正することで、可能になります。

 

getTextSizeの構文

getTextSize( text, fontFace, fontScale, thickness ) -> size, baseLine

引数

text 描画に用いる文字列
fontFace 描画時のフォント
cv2.FONT_HERSHEY_SIMPLEX
cv2.FONT_HERSHEY_PLAIN
cv2.FONT_HERSHEY_DUPLEX
cv2.FONT_HERSHEY_COMPLEX
cv2.FONT_HERSHEY_TRIPLEX
cv2.FONT_HERSHEY_COMPLEX_SMALL
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
cv2.FONT_HERSHEY_SCRIPT_COMPLEX
cv2.FONT_ITALIC
fontScale 文字の大きさの倍率
thickness 線幅を整数で指定します。

 

戻り値

size 文字の大きさを(幅, 高さ)のタプルで取得します。
baseLine 文字(g, j, p, q, y)の領域から下側にはみ出す量を取得します。

 

サンプルプログラム

import cv2
import numpy as np

img = np.zeros((200, 600, 3), dtype = np.uint8)

text = "abgpqABC123"    # 大きさを測る文字列
fontFace = cv2.FONT_HERSHEY_SIMPLEX # フォント
fontScale = 2           # 文字のサイズ
thickness = 1           # 文字の太さ

bottom_left = (50, 100)

# 文字の大きさを測る
size, baseLine = cv2.getTextSize(text, fontFace, fontScale, thickness)
print(size, baseLine ) # 出力結果 ->  (431, 43) 18

# putTextで指定した左下の位置
cv2.circle(img, bottom_left, 5, (255, 255, 0), -1)
# getTextSizeで取得した領域
cv2.rectangle(img, bottom_left, (bottom_left[0] + size[0], bottom_left[1] - size[1]), (0, 0, 255), 1)
# baseline(g, j, p, q, yの下側にはみ出す量)
cv2.line(img, (bottom_left[0], bottom_left[1] + baseLine), (bottom_left[0] + size[0], bottom_left[1] + baseLine),
         (0, 255, 255), 1)

# 文字の描画
cv2.putText(img, text, bottom_left, fontFace, fontScale, (255, 255, 255), thickness)

cv2.imshow("Image", img)
cv2.waitKey()

実行結果

 

関連リンク

https://imagingsolution.net/program/python/opencv-python/opencv-reference/opencv-python-puttext/

参照ページ

https://docs.opencv.org/4.8.0/d6/d6e/group__imgproc__draw.html#ga3d2abfcb995fd2db908c8288199dba82

【OpenCV-Python】putText(文字の描画)

OpenCVで画像に文字を描画するにはputText()関数を用います。

ただし、日本語の描画を行うことはできません。

putTextの構文

putText( img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]] ) -> img

引数

img 文字の描画先の画像データ
text 描画する文字列
ただし、日本語には対応していません。
org 文字を描画する位置を文字領域の左下の位置で指定します。
fontFace 文字のフォントの種類を以下の中から指定します。
cv2.FONT_HERSHEY_SIMPLEX
cv2.FONT_HERSHEY_PLAIN
cv2.FONT_HERSHEY_DUPLEX
cv2.FONT_HERSHEY_COMPLEX
cv2.FONT_HERSHEY_TRIPLEX
cv2.FONT_HERSHEY_COMPLEX_SMALL
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
cv2.FONT_HERSHEY_SCRIPT_COMPLEX
cv2.FONT_ITALIC
fontScale 文字を大きさの倍率を指定します。
color 線色
カラーの場合は、(B, G, R)の順のタプルで指定します。
thickness 線幅を整数で指定します。
lineType cv2.LINE_4     4連結
cv2.LINE_8     8連結(デフォルト)
cv2.LINE_AA   アンチエイリアス
のいずれかを指定します。
bottomLeftOrigin 画像データの始まりの位置が左下の場合、Trueを指定します。
通常は、画像データの始まりは左上なので、False(初期値)で大丈夫です。

 

戻り値

img 画像データに追加で文字が描画された画像データ(引数で渡した画像と同じデータ)

サンプルプログラム

import cv2
import numpy as np

img = np.zeros((400, 600, 3), dtype = np.uint8)

# Textの描画
img = cv2.putText(img, "abcdefg ABC 123", (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255))
# Textの表示位置
img = cv2.circle(img, (10, 40), 5, (0, 0, 255),  -1)

cv2.imshow("Image", img)
cv2.waitKey()

実行結果

 

フォントの種類について

フォントの種類については、全てのフォントを使ったサンプルを作成しましたので、こちらを参照ください。

import cv2
import numpy as np

img = np.zeros((400, 600, 3), dtype = np.uint8)

# Textの描画(Fontごとの描画)
img = cv2.putText(img, "FONT_HERSHEY_SIMPLEX", (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255))
img = cv2.putText(img, "FONT_HERSHEY_PLAIN", (10, 80), cv2.FONT_HERSHEY_PLAIN, 1, (255, 255, 255))
img = cv2.putText(img, "FONT_HERSHEY_DUPLEX", (10, 120), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 255, 255))
img = cv2.putText(img, "FONT_HERSHEY_COMPLEX", (10, 160), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255))
img = cv2.putText(img, "FONT_HERSHEY_TRIPLEX", (10, 200), cv2.FONT_HERSHEY_TRIPLEX, 1, (255, 255, 255))
img = cv2.putText(img, "FONT_HERSHEY_COMPLEX_SMALL", (10, 240), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (255, 255, 255))
img = cv2.putText(img, "FONT_HERSHEY_SCRIPT_SIMPLEX", (10, 280), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 1, (255, 255, 255))
img = cv2.putText(img, "FONT_HERSHEY_SCRIPT_COMPLEX", (10, 320), cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 1, (255, 255, 255))
img = cv2.putText(img, "FONT_ITALIC", (10, 360), cv2.FONT_ITALIC, 1, (255, 255, 255))

cv2.imshow("Image", img)
cv2.waitKey()

実行結果

 

その他のオプション設定

putText()関数では、フォントの種類の他に、文字の表示倍率、線色、色、線幅、アンチエイリアス、データの基準位置に関する設定が可能になっています。

こちらについては、それぞれのオプションを設定したサンプルを作成しましたので、合わせてご参照ください。

import cv2
import numpy as np

img = np.zeros((400, 600, 3), dtype = np.uint8)

# 1倍
img = cv2.putText(img, "abcdefg ABC 123", (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255))
# 2倍
img = cv2.putText(img, "abcdefg ABC 123", (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 255, 255))

# 文字色を赤
img = cv2.putText(img, "abcdefg ABC 123", (10, 140), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255))
# 線幅を3
img = cv2.putText(img, "abcdefg ABC 123", (10, 180), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 3)
# lineTypeをLINE_AA 
img = cv2.putText(img, "abcdefg ABC 123", (10, 220), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1, cv2.LINE_AA)
# bottomLeftOrigin をTrue
img = cv2.putText(img, "abcdefg ABC 123", (10, 260), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1, cv2.LINE_AA, True)

cv2.imshow("Image", img)
cv2.waitKey()

実行結果

 

関連リンク

https://imagingsolution.net/program/python/opencv-python/opencv-reference/opencv-python-linetypes/

 

参照ページ

https://docs.opencv.org/4.8.0/d6/d6e/group__imgproc__draw.html#ga5126f47f883d730f633d74f07456c576

https://docs.opencv.org/4.8.0/d6/d6e/group__imgproc__draw.html#ga0f9314ea6e35f99bb23f29567fc16e11