ITや趣味など気軽に投稿しています。

【Python】OpenCVで画像に文字を表示する

今回は、OpenCVで画像に文字を表示する方法についてだ。

お願いします。

事前準備

毎回ながら、前提条件は画像の読込等の処理を掲載しておく。

import cv2

path = "input/fox.jpg"
img = cv2.imread(path)
height, width = img.shape[:2]


#画像のリサイズ(1/4に)
img = cv2.resize(img,(round(width/4), round(height/4)))

文字を描画する(cv.puttext())

文字の描画にはcv.putText()を使用する。

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

わ、今回も引数が多いですね、、

サンプルコード

まずputtext()を使ったサンプルコードを紹介する。

imageText = img.copy()
text = 'Sample text is here!'
#始点の座標
org = (50,350)
cv2.putText(imageText, text, org, fontFace = cv2.FONT_HERSHEY_COMPLEX, fontScale = 1.5, color = (250,225,0))

cv2.imshow("Image Text",imageText)
cv2.waitKey(0)
cv2.putText(imageText, text, org, fontFace = cv2.FONT_HERSHEY_COMPLEX, fontScale = 1.5, color = (250,225,0))

引数

固有の引数のみ紹介する。それ以外はOpenCV共通の引数を参照してほしい。

OpenCV共通の引数

引数説明
text表示する文字列
org文字列の左下端の座標。
表示の開始位置
fontFaceフォント
fontScale文字のサイズ(倍率)
color文字の色
thickness文字の太さ
bottomLeftOrigintrueの場合、画像の原点が左下。
falseの場合、画像の原点が左上。
(デフォルトはtrue)

colorまでが必須の引数となる。それ以降は必要に応じて指定するとよい。

fontFace

fontFaceは文字のフォントを指定するものだが、ここでは9種類のフォントが指定できる。

9種類?意外と少ない気が。

OpenCVではHershey fontsというフォントに対応している。具体的には以下のフォントを指定できる。

フォント説明
cv.FONT_HERSHEY_SIMPLEXsans-serif(通常サイズ)
cv.FONT_HERSHEY_PLAINsans-serif(小サイズ)
cv.FONT_HERSHEY_DUPLEXsans-serif(通常サイズ)
※cv.FONT_HERSHEY_SIMPLEXより複雑
cv.FONT_HERSHEY_COMPLEXserif(通常サイズ)
cv.FONT_HERSHEY_TRIPLEXserif(通常サイズ)
※cv.FONT_HERSHEY_COMPLEXより複雑
cv.FONT_HERSHEY_COMPLEX_SMALLserif(小サイズ)
cv.FONT_HERSHEY_SCRIPT_SIMPLEX手書きフォント
cv.FONT_HERSHEY_SCRIPT_COMPLEX手書きフォント
※cv.FONT_HERSHEY_SCRIPT_COMPLEXより複雑
cv.FONT_ITALICイタリックフォント

スタイルとしては以下の画像の通りだ。

フォントスタイル比較

フォントの指定なのにサイズとかあるんですね。。

うむ。なお、OpenCVのみでは現状日本語を表示することができない。日本語を表示するにはPillowなど他のパッケージを組み合わせる必要があるが、それは別の機会に紹介する。

fontScale

fontScaleは文字のスケールを設定するパラメータだ。拡大倍率を数字で指定する。

fontFaceでデフォルトのサイズが決まっていて、fontScaleで拡大倍率を決める感じですね。

その通り。1以上の数字を指定すると文字が拡大され、0以より大きく1未満の数字を指定すると文字が縮小される。

なるほどです。ちなみに、0以下の数字を指定するとどうなるんです?

0以下を指定すると、文字が反転する。
例を見てみよう。

cv2.putText(imageText, 'FONT_HERSHEY_COMPLEX', (10,40), fontFace = cv2.FONT_HERSHEY_COMPLEX, fontScale = 1, color = (250,225,0))
cv2.putText(imageText, 'FONT_HERSHEY_COMPLEX', (10,80), fontFace = cv2.FONT_HERSHEY_COMPLEX, fontScale = 1.5, color = (250,225,0))
cv2.putText(imageText, 'FONT_HERSHEY_COMPLEX', (10,120), fontFace = cv2.FONT_HERSHEY_COMPLEX, fontScale = 0.5, color = (250,225,0))
cv2.putText(imageText, 'FONT_HERSHEY_COMPLEX', (450,160), fontFace = cv2.FONT_HERSHEY_TRIPLEX, fontScale = -1, color = (250,225,0))
fontScale例

0以下にすると上下左右反転するんですね。

bottomLeftOrigin

最後はbottomLeftOriginだが、OpenCVで画像を二次元平面に置いた時の原点座標はどこだった?

確か、左上ですよね。

その通り。だが、bottomLeftOriginをTrueにすると、原点が画像左下として計算される。

bottomLeftOrigin=Trueの場合の原点
bottomLeftOrigin=Trueの場合の原点

左端ってことは変わらないんですね。

左様。そして、このbottomLeftOriginはデフォルトではFalseになっている。つまり、指定しなければ原点は左上ということだ。

まとめ

以上、OpenCVで画像に文字を表示を紹介した。文字の表示にはputtext()を使うんだったな。

OpenCVだけでは日本語は表示できないんでしたね。日本語表示は別の機会に、お願いします。

では今日はここまで。

ありがとうございました~~♪