2023年01月28日 更新

OpenCVで日本語表示

どうも、クラゲです。

ラズパイでOpenCVを使って文字列描画を行う際に、簡単に日本語表示する方法をご紹介します。OpenCVのインストール方法や基礎的な使い方についてはこちらを参照してください。

文字化け

cv2.putTextを使って日本語で文字列を描画しようとすると???...?という表示になってしまいます。

import cv2

image_file = 'cat.png'
img = cv2.imread(image_file)
cv2.putText(img, "吾輩は猫である", (80, 530), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 8)
cv2.imshow('image', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

対策

以下のコードで日本語表示できます。

import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image

def putText_japanese(img, text, point, size, color):
    #Notoフォントとする
    font = ImageFont.truetype('/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc', size)

    #imgをndarrayからPILに変換
    img_pil = Image.fromarray(img)

    #drawインスタンス生成
    draw = ImageDraw.Draw(img_pil)

    #テキスト描画
    draw.text(point, text, fill=color, font=font)

    #PILからndarrayに変換して返す
    return np.array(img_pil)

#ここから下がメインコード
img= cv2.imread("cat.png")

# cv2.putTextのフォントサイズとはスケールが異なるので注意
img = putText_japanese(img, "吾輩は猫である", (50, 450), 100, (25, 131, 255))

cv2.imshow("window", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

PIL(Python Imaging Library)を活用して、putText_japaneseという関数を作っています。以下の引数で指定できます。

出力先画像、表示文字列, 表示位置(X, Y), フォントサイズ, 色(B, G, R)

PILを使用しているのはputText_japanese関数の中だけなので、メインコードの部分では意識しなくてOKです。ただし、この関数を使う際は以下のimportが必要です。

import numpy as np
from PIL import ImageFont, ImageDraw, Image

また、Raspberry Pi OSの場合、/usr/share/fonts/の中にフォントが入っています。今回はその中のNotoフォントを活用しているため、別途フォントのダウンロードやインストールは不要です。

以上、「OpenCVで日本語表示」でした!