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

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

画像処理において、画像上にテキスト情報を描画したい場面は多くあります。 例えば、検出結果のラベルを重ねたり、画像にキャプションを追加したりするケースです。

この記事では、OpenCVのcv2.putText()を使って画像に文字を描画する方法を解説します。

事前準備

以下のコードで画像の読み込みとリサイズを行います。

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)))

文字を描画する(cv2.putText())

文字の描画にはcv2.putText()を使用します。

構文

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

サンプルコード

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() 実行結果

引数

colorまでが必須の引数です。それ以降は必要に応じて指定します。

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

fontFace(フォントの種類)

OpenCVではHersheyフォントと呼ばれる9種類のフォントが使用できます。

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

各フォントの見た目は以下の通りです。

フォントスタイル比較

注意: OpenCV単体では日本語の文字を表示することができません。日本語を表示するにはPillowなど他のパッケージと組み合わせる必要があります。

fontScale(文字サイズの倍率)

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

  • 1以上: 文字が拡大される
  • 0より大きく1未満: 文字が縮小される
  • 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例

fontScaleに0以下を指定すると、文字が上下左右に反転して表示されることがわかります。

bottomLeftOrigin(原点の位置)

OpenCVでは通常、画像の原点は左上に設定されています。bottomLeftOriginTrueに設定すると、原点が左下に変更されます。

bottomLeftOrigin=Trueの場合の原点

デフォルト(False)では原点が左上なので、通常はこの引数を指定する必要はありません。座標系を変更したい特殊なケースでのみ使用します。

まとめ

今回は、OpenCVで画像に文字を描画する方法を紹介しました。

  • 文字の描画にはcv2.putText()を使用する
  • 9種類のHersheyフォントが利用可能
  • fontScaleで文字サイズの倍率を指定できる
  • OpenCV単体では日本語表示に非対応(Pillowとの組み合わせが必要)