【OpenCV】cv2.putText関数の使い方【文字を描画する】

【OpenCV】cv2.putText関数の使い方【文字を描画する】プログラミング
ゆうすけ
ゆうすけ

cv2.putText関数ってどう使うんですか・・・?

資格マフィア
資格マフィア

cv2.putText関数は画像に文字を印字する時に使用する。
関数の使い方も解説しよう。

 

✔️ 本記事のテーマ

cv2.putText関数の使い方

 

✔️ 読者さんへの前置きメッセージ

本記事は「OpenCV の putText関数」について書いています。

 

この記事を読むことで
「cv2.putTextの使い方 や 画像に文字を印字する方法」
について理解できます。

 

OpenCVには様々な関数が用意されています。

 

その中の一つにcv2.putText関数があります。

 

cv2.putText関数を使えばプログラムで「画像に文字を描画する」ことができます。

 

この記事ではcv2.putText関数の使い方や関数に与える引数まで徹底的に解説します。

 

それでは、解説していきましょう。

cv2.putText関数のサンプルコード

cv2.putText関数のサンプルコード

cv2.putTextを使用したサンプルコードは以下のようなコードです。
この記事ではこのサンプルコードに沿って解説していきます。

import cv2

img = cv2.imread('./sample.png')

cv2.putText(img,
            text='sample text',
            org=(100, 300),
            fontFace=cv2.FONT_HERSHEY_SIMPLEX,
            fontScale=1.0,
            color=(0, 255, 0),
            thickness=2,
            lineType=cv2.LINE_4)

cv2.imwrite('./sample_after.png', img)

 

このサンプルコードによって、生成される画像はこちらになります。

画像_cv2.putTextのサンプルコード

 

画像に「sample  text」という文字が印字されています。

 

cv2.putText関数の引数について

cv2.putText関数の引数について

サンプルコードの通り、cv2.putText関数は8個の引数を取ります。

cv2.putText(img,
            text='sample text',
            org=(100, 300),
            fontFace=cv2.FONT_HERSHEY_SIMPLEX,
            fontScale=1.0,
            color=(0, 255, 0),
            thickness=2,
            lineType=cv2.LINE_4)

これらの引数がどのような意味を持つのかを順番に解説していきましょう。

cv2.putText関数の第1引数:img

cv2.putText関数の第1引数 img対象の画像データです。
Ndarray 型で指定します。

 

OpenCVで画像処理を行うためには、
まずcv2.imread関数によって画像データを読み込む必要があります。

img = cv2.imread('./sample.png')

 

サンプルコードではpythonファイルと同階層にある sample.png を読み込んでいます。

 

このようにして、読み込んだ画像データをcv2.putTextに引数で渡すことで、その画像データに対して長方形を描画します。

 

なお、OpenCVによる画像の読み込みについては
OpenCVで画像を読み込む方法【Python】
の記事で解説しています。

 

cv2.putText関数の第2引数:text

cv2.putTextの第2引数 text は描画する文字です。
String型で指定します。

 

画像に描画したい文字を指定します。
半角記号や半角スペースなども認識してくれます。

 

ただ、日本語と全角記号は認識しません。
これらを渡すと????????????という文字列で描画されます。

import cv2

img = cv2.imread('./sample.png')

cv2.putText(img,
            text='「サンプル」',
            org=(100, 300),
            fontFace=cv2.FONT_HERSHEY_SIMPLEX,
            fontScale=1.0,
            color=(0, 255, 0),
            thickness=2,
            lineType=cv2.LINE_4)

cv2.imwrite('./sample_after.png', img)

変更後画像_putTextの第2引数

 

text には英数字 + 半角記号のみを渡すようにしましょう。

 

cv2.putText関数の第3引数:org

cv2.putTextの第3引数 pt2 は描画する長方形の右下頂点の座標です。
(int型, int型)のtupleで指定します。

 

ちょうど以下の画像の丸で囲った点の座標です。

画像_putTextの第3引数

 

座標は(x座標のピクセル, y座標のピクセル)で指定する必要があります。

 

サンプルコードでは org=(100, 300) と指定しているので、
x座標: 100px, y座標: 300pxを左下とする位置に文字を印字しています。

 

試しに org=(100, 100) と指定すると、
以下の画像のように印字されます。

import cv2

img = cv2.imread('./sample.png')

cv2.putText(img,
            text='sample text',
            org=(100, 100),
            fontFace=cv2.FONT_HERSHEY_SIMPLEX,
            fontScale=1.0,
            color=(0, 255, 0),
            thickness=2,
            lineType=cv2.LINE_4)

cv2.imwrite('./sample_after.png', img)

変更後画像_putTextの第3引数

 

 

cv2.putText関数の第4引数:fontFace

cv2.putTextの第4引数 fontFace は描画するフォントの種類です。
OpenCVの独自コードで指定します。

 

fontFace には以下のコードを指定することができます。
Hershey Fontsというシンプルなフォントを土台にしています。

  • 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

 

各コードを使うことで描画する文字の太さやサイズが微妙に異なります。
例えば cv2.FONT_HERSHEY_TRIPLEX を使用すると以下のようなフォントで描画されます。

import cv2

img = cv2.imread('./sample.png')

cv2.putText(img,
            text='sample text',
            org=(100, 300),
            fontFace=cv2.FONT_HERSHEY_TRIPLEX,
            fontScale=1.0,
            color=(0, 255, 0),
            thickness=2,
            lineType=cv2.LINE_4)

cv2.imwrite('./sample_after.png', img)

変更後画像_putTextの第4引数

 

なお、全てのコードに対する詳細はOpenCVの公式ドキュメントに記載されています。

OpenCV: Core functionality

 

cv2.putText関数の第5引数:fontScale

cv2.putTextの第5引数 fontScale は描画する文字の縮尺です。
float型で指定します。

 

1.0を基準として何倍縮尺で描画するかを指定します。

 

サンプルコードでは fontScale=1 としているので等倍の文字を印字しています。

 

試しに fontScale=2.0 とすると、文字を2倍の大きさで印字します。

import cv2

img = cv2.imread('./sample.png')

cv2.putText(img,
            text='sample text',
            org=(100, 300),
            fontFace=cv2.FONT_HERSHEY_SIMPLEX,
            fontScale=2.0,
            color=(0, 255, 0),
            thickness=2,
            lineType=cv2.LINE_4)

cv2.imwrite('./sample_after.png', img)

変更後画像_putTextの第5引数

 

 

cv2.putText関数の第6引数:color

cv2.putTextの第6引数 color は描画する文字の色です。
(int型, int型, int型)のtupleで指定します。

 

colorは以下のBGR形式で指定する必要があります。

color = (青, 緑, 赤)

このような順番で3原色を数値で指定します。
各色の最大値は255です。

 

サンプルコードでは color=(0, 255, 0) としているので緑色を指定していることになります。

 

試しに color=(0, 0, 255)とすると、以下の画像のように青色で文字が印字されます。

import cv2

img = cv2.imread('./sample.png')

cv2.putText(img,
            text='sample text',
            org=(100, 300),
            fontFace=cv2.FONT_HERSHEY_SIMPLEX,
            fontScale=1.0,
            color=(255, 0, 0),
            thickness=2,
            lineType=cv2.LINE_4)

cv2.imwrite('./sample_after.png', img)

変更後画像_putTextの第6引数

 

 

cv2.putText関数の第7引数:thickness

cv2.putTextの第7引数 thickness は印字する文字の太さです。
int型で指定します。

 

以下の形式で印字する文字の太さを指定することができます。

thickness = 数値(ピクセル)

 

サンプルコードでは thickness=2 としているので太さ2pxの線を描画しています。

 

試しにサンプルコードを thickness=1 とすると、以下のように細い文字で描画されます。

import cv2

img = cv2.imread('./sample.png')

cv2.putText(img,
            text='sample text',
            org=(100, 300),
            fontFace=cv2.FONT_HERSHEY_SIMPLEX,
            fontScale=1.0,
            color=(0, 255, 0),
            thickness=1,
            lineType=cv2.LINE_4)

cv2.imwrite('./sample_after.png', img)

変更後画像_putTextの第7引数

 

なお、引数 thickness負の数を渡すと、cv2.errorが発生します。

cv2.error: OpenCV(4.4.0) /private/var/folders/nz/vv4_9tw56nv9k3tkvyszvwg80000gn/T/pip-req-build-gi6lxw0x/opencv/modules/imgproc/src/drawing.cpp:1801: error: (-215:Assertion failed) 0 < thickness && thickness <= MAX_THICKNESS in function 'putText'

 

thickness には0以上の整数を指定しましょう。
(なお、0を渡すと thickness=1 と同じ細さになります)

 

ちなみに、thicknessはデフォルト引数なので、引数を渡さなくともcv2.putText関数は動きます。
引数で値を渡さなかった場合は thickness=1の挙動になります。

 

なお、デフォルト引数については
pythonのデフォルト引数についての解説
の記事で解説しています。

 

cv2.putText関数の第8引数:lineType

cv2.putTextの第6引数 lineType は文字を描画するアルゴリズムの種類です。
OpenCVの独自コードで指定します。

 

引数lineTypeでは以下のアルゴリズムを選択することができます。

  • 4連結: cv2.LINE_4
  • 8連結: cv2.LINE_8(デフォルト)
  • アンチエイリアス: cv2.LINE_AA

 

lineTypeはデフォルト引数なので、引数を渡さなくともcv2.putText関数は動きます。
引数で値を渡さなかった場合は lineType=cv2.LINE_8 の挙動になります。

 

アンチエイリアスとはピクセルの境目に出るギザギザを滑らかに表現する手法です。

 

試しに、
一番荒く描画される cv2.LINE_4
一番滑らかに描画される cv2.LINE_AA を比較してみましょう。

 

LINE_4とLINE_AAの比較画像

 

cv2.LINE_AAの方が気持ち滑らかに(くっきりと)描画されています。

 

画像処理プログラミングを独学で勉強するなら

画像処理プログラミングを独学で勉強するなら

OpenCVのputText関数の使い方と引数について解説しました。

 

OpenCVは画像処理には欠かすことのできないライブラリです。

 

もし、OpenCVについて独学でスキルをつけるなら、以下の書籍がオススメです。

 

この書籍はOpenCVの基礎から応用までを
丁寧にかつ詳細に解説しています。

 

OpenCVのほぼ全てを網羅しているとも言えるほどの徹底ぶりなので、
関数のリファレンスとしても使用することができます。
本記事で解説したcv2.putText関数も掲載されています。

エンジニアとしての自身の価値をチェックする(完全無料)

エンジニアとして、

自分の価値がどれくらいのものかご存知でしょうか?

 

エンジニアとしてIT業界に身を置いていると

今の会社でずっと働くのか、フリーランスとして独立するのか …

と様々な選択肢があります。

 

どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも

自身の価値を知っておくことはとても重要です。

 

TechClips ME では、

職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。

▼▼▼▼▼

▲▲▲▲▲

しかもTechClips MEでは想定年収を企業から提示してくれるので、

自身の価値を数字で分かりやすくたしかめることができます。

 

登録はもちろん完全無料なので、一度登録してみると良いかもしれません。

 

コメント

タイトルとURLをコピーしました