python OpenCV putTextの使い方

pythonのOpenCVで、画像にテキストを描画するputText関数の使い方についてまとめてみました。

参考にしてみてください。

画像にテキストを描画するcv2.putText関数

この関数では画像に文字列を描画することができます。

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

引数:

  • img – テキストを描画したい画像。
  • text – string。描画したい文字列。
  • org – (x,y) 文字列の位置を指定。 文字の左下の位置が基準となります。
  • fontFace – フォントを指定することができます。
    以下のフォントが用意されており、いずれもFONT_ITALICと組み合わせて使用できます。
    FONT_HERSHEY_SIMPLEX
    FONT_HERSHEY_PLAIN
    FONT_HERSHEY_DUPLEX
    FONT_HERSHEY_COMPLEX
    FONT_HERSHEY_TRIPLEX
    FONT_HERSHEY_COMPLEX_SMALL
    FONT_HERSHEY_SCRIPT_SIMPLEX
    FONT_HERSHEY_SCRIPT_COMPLEX

  • fontScale – float。フォントのサイズを指定します。
  • color – (R,G,B)(uint8) フォントの色を指定します。
    各チャンネルは0~255までの値で、(0,0,0)で黒、(255,255,255)で白となります。
  • lineType – int。描画する線の種類を指定します。4,8,LINE_AAの3つが用意されています。
    指定しなかった場合のデフォルトは8。
  • bottomLeftOrigin – bool。画像データの原点を左下にセットするか。
    指定しなかった場合のデフォルトはFalse。

文字を描画してみる

文字を描画するスクリプトのサンプル。
真っ黒な背景に白文字で”sample text”の文字を描画する。

import cv2
import numpy as np

img = np.zeros( (100, 300, 3), dtype=np.uint8 )
cv2.putText( img, "sample text", (0,30), cv2.FONT_HERSHEY_SIMPLEX, 1, color=(255,255,255), thickness=1, lineType=cv2.LINE_AA )
cv2.namedWindow( "screen" )
cv2.imshow( "screen", img )
cv2.waitKey(0)

結果

フォントの種類について

FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_DUPLEX, FONT_HERSHEY_COMPLEX,
FONT_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL, FONT_HERSHEY_SCRIPT_SIMPLEX, FONT_HERSHEY_SCRIPT_COMPLEX

以上の8種類のフォントが用意されている。これらを比較してみる。

import cv2
import numpy as np

img = np.zeros( (270, 1200, 3), dtype=np.uint8 )
color = (255,255,255)

cv2.putText( img, "FONT_HERSHEY_SIMPLEX" , (0,30) , cv2.FONT_HERSHEY_SIMPLEX , 1, color )
cv2.putText( img, "FONT_HERSHEY_PLAIN" , (0,60) , cv2.FONT_HERSHEY_PLAIN , 1, color )
cv2.putText( img, "FONT_HERSHEY_DUPLEX" , (0,90) , cv2.FONT_HERSHEY_DUPLEX , 1, color )
cv2.putText( img, "FONT_HERSHEY_COMPLEX" , (0,120) , cv2.FONT_HERSHEY_COMPLEX , 1, color )
cv2.putText( img, "FONT_HERSHEY_TRIPLEX" , (0,150) , cv2.FONT_HERSHEY_TRIPLEX , 1, color )
cv2.putText( img, "FONT_HERSHEY_COMPLEX_SMALL" , (0,180) , cv2.FONT_HERSHEY_COMPLEX_SMALL , 1, color )
cv2.putText( img, "FONT_HERSHEY_SCRIPT_SIMPLEX", (0,210) , cv2.FONT_HERSHEY_SCRIPT_SIMPLEX , 1, color )
cv2.putText( img, "FONT_HERSHEY_COMPLEX_SMALL" , (0,240) , cv2.FONT_HERSHEY_COMPLEX_SMALL , 1, color )
cv2.putText( img, "FONT_HERSHEY_SIMPLEX" , (600,30) , cv2.FONT_HERSHEY_SIMPLEX | cv2.FONT_ITALIC , 1, color )
cv2.putText( img, "FONT_HERSHEY_PLAIN" , (600,60) , cv2.FONT_HERSHEY_PLAIN | cv2.FONT_ITALIC , 1, color )
cv2.putText( img, "FONT_HERSHEY_DUPLEX" , (600,90) , cv2.FONT_HERSHEY_DUPLEX | cv2.FONT_ITALIC , 1, color )
cv2.putText( img, "FONT_HERSHEY_COMPLEX" , (600,120), cv2.FONT_HERSHEY_COMPLEX | cv2.FONT_ITALIC , 1, color ) cv2.putText( img, "FONT_HERSHEY_TRIPLEX" , (600,150), cv2.FONT_HERSHEY_TRIPLEX | cv2.FONT_ITALIC , 1, color )
cv2.putText( img, "FONT_HERSHEY_COMPLEX_SMALL" , (600,180), cv2.FONT_HERSHEY_COMPLEX_SMALL | cv2.FONT_ITALIC , 1, color )
cv2.putText( img, "FONT_HERSHEY_SCRIPT_SIMPLEX", (600,210), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX | cv2.FONT_ITALIC, 1, color )
cv2.putText( img, "FONT_HERSHEY_COMPLEX_SMALL" , (600,240), cv2.FONT_HERSHEY_COMPLEX_SMALL | cv2.FONT_ITALIC , 1, color )

cv2.namedWindow( "screen" )
cv2.imshow( "screen", img )
cv2.waitKey(0)

結果

いずれのフォントにもFONT_ITALICが使えると書いておきながら、FONT_HERSHEY_SIMPLEXとFONT_FERSHEY_DUPLEXがイタリック体になっていないのが気になるが、、、

lineTypeについて

lineTypeには4,8,LINE_AAの3種類がある。

  • 4 – 4近傍連結
  • 8 – 8近傍連結(デフォルト)
  • LINE_AA – アンチエイリアス処理

特に何もないなら LINE_AA を指定することをオススメします。
アンチエイリアス処理のために一番滑らかな線となります。

import cv2
import numpy as np

img = np.zeros( (120, 300, 3), dtype=np.uint8 )
color = (255,255,255)

cv2.putText( img, "lineType : 4" , (0,30), cv2.FONT_HERSHEY_SIMPLEX , 1, color, lineType=4 )
cv2.putText( img, "lineType : 8" , (0,60), cv2.FONT_HERSHEY_SIMPLEX , 1, color, lineType=8 )
cv2.putText( img, "lineType : LINE_AA" , (0,90), cv2.FONT_HERSHEY_SIMPLEX , 1, color, lineType=cv2.LINE_AA )

cv2.namedWindow( "screen" )
cv2.imshow( "screen", img )
cv2.waitKey(0)

結果

LINE_AAが一番滑らかに描画されていると思います。
4近傍の場合では、連結判定のピクセルが少ないために若干太い線で描かれているのが分かると思います。
8近傍では逆に、少し細い線で描かれています。