2023年01月28日 更新
どうも、クラゲです。
ラズパイで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で日本語表示」でした!