今回は、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)

引数
固有の引数のみ紹介する。それ以外はOpenCV共通の引数を参照してほしい。
引数 | 説明 |
---|---|
text | 表示する文字列 |
org | 文字列の左下端の座標。 表示の開始位置 |
fontFace | フォント |
fontScale | 文字のサイズ(倍率) |
color | 文字の色 |
thickness | 文字の太さ |
bottomLeftOrigin | trueの場合、画像の原点が左下。 falseの場合、画像の原点が左上。 (デフォルトはtrue) |
colorまでが必須の引数となる。それ以降は必要に応じて指定するとよい。
fontFace
fontFaceは文字のフォントを指定するものだが、ここでは9種類のフォントが指定できる。
9種類?意外と少ない気が。
OpenCVではHershey fontsというフォントに対応している。具体的には以下のフォントを指定できる。
フォント | 説明 |
---|---|
cv.FONT_HERSHEY_SIMPLEX | sans-serif(通常サイズ) |
cv.FONT_HERSHEY_PLAIN | sans-serif(小サイズ) |
cv.FONT_HERSHEY_DUPLEX | sans-serif(通常サイズ) ※cv.FONT_HERSHEY_SIMPLEXより複雑 |
cv.FONT_HERSHEY_COMPLEX | serif(通常サイズ) |
cv.FONT_HERSHEY_TRIPLEX | serif(通常サイズ) ※cv.FONT_HERSHEY_COMPLEXより複雑 |
cv.FONT_HERSHEY_COMPLEX_SMALL | serif(小サイズ) |
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))

0以下にすると上下左右反転するんですね。
bottomLeftOrigin
最後はbottomLeftOriginだが、OpenCVで画像を二次元平面に置いた時の原点座標はどこだった?
確か、左上ですよね。
その通り。だが、bottomLeftOriginをTrueにすると、原点が画像左下として計算される。

左端ってことは変わらないんですね。
左様。そして、このbottomLeftOriginはデフォルトではFalseになっている。つまり、指定しなければ原点は左上ということだ。
まとめ
以上、OpenCVで画像に文字を表示を紹介した。文字の表示にはputtext()を使うんだったな。
OpenCVだけでは日本語は表示できないんでしたね。日本語表示は別の機会に、お願いします。
では今日はここまで。
ありがとうございました~~♪