[Python] OpenCVでは日本語テキストを描画できない – PIL/pillowでテキスト表示

 OpenCV、RGBがBGRになったりパスに日本語使えないとか変なとこありますが、日本語テキストもcv2.putTextで表示できません。

 表示しようとする「?????」という表記になってしまいます。

PILで日本語テキスト表示

 まずはPILのインストール。

pip install pillow

 日本語表示はこんな感じでやればいけます。

 フォントはOSそれぞれでパスが異なります。申し訳ないですが、手元にWindowsしかないので他は全部拾い物のパス使ってます。まともに動くかわかりません。

 注意点はImageDrawの扱いくらいでしょうか。

 ImageDrawはPIL.Imageを受け取り、draw.textは受け取ったPIL.Imageに直接書き込みます。

 元のものに書き込みされるので、残しておきたいならcopyなどしておく必要があります。

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

image = cv2.imread(<画像ファイルパス>)

text = "テストABCabc1234$"
text_x, text_y = 100, 100  # テキスト表示する左上の座標
font_size = 14
text_color = (0, 0, 255)  # 赤文字, 元がOpenCV画像のためBGR表記

pil_image = Image.fromarray(image)
draw = ImageDraw.Draw(pil_image)

# OSごとにパスが異なる
font_path_dict = {
  # この例だとメイリオを使用. ほかのフォントにも当然変更できる
  "Windows": "C:/Windows/Fonts/meiryo.ttc",
  # Windows以外拾い物で動作確認できてないので間違ってるかもしれません
  "Darwin": "/System/Library/Fonts/Courier.dfont",  # Mac
  "Linux": "/usr/share/fonts/OTF/TakaoPMincho.ttf"
}

font_path = font_path_dict.get(platform.system())
if font_path is None:
  assert False, "想定してないOS"

draw.font = ImageFont.truetype(font_path, font_size)  # font設定
draw.text((text_x, text_y), text, text_color)  # pil_imageに直接書き込み
result_image = np.array(pil_image)  # OpenCV/numpy形式に変換

# 画像表示
cv2.imshow("test", result_image)
cv2.waitKey()

コメントを残す

メールアドレスが公開されることはありません。