アオカケスの鳥かご

日々の出来事を綴っていきたい

OpenCVで日本語を描画する関数

どうやらOpenCV単体で日本語を描画するのは困難なようです。

そのため、日本語はPillowに任せて、出来上がったものをOpenCVで表示する、といった方法を取らなければならないようです。
※頑張ればOpenCV単体でもいけるのかもしれません

以下が参考になります。
qiita.com


ただ日本語を描画できるようになっただけだと味気ないので、もっと手軽に日本語を描画できるように関数を作りました。

フォント

16行目でフォントのパスを指定します。

お気に入りのフォントを指定しましょう。ttfやttcなどの拡張子のフォントであれば何でもいけそうな感じです。


ちなみに私の最近のお気に入りフォントは「あんずもじ」です。
http://www8.plala.or.jp/p_dolce/

windows用とは書いてありますがLinuxでも普通に使えました。


いかにも女子が書いたような可愛らしい文字です。
f:id:aokakes:20191105173159p:plain


明朝体などは読みやすいですが、少し堅い雰囲気になってしまいます。

場面によってフォントを使い分けると見る人に与える印象も変わるものですし、フォントは大事だな~と思います。

inputJP関数

引数に描画したい画面や文字列、座標などを指定します。

詳細は以下。

パラメータ 説明
name 文字列を描画したい画面の名前
img 文字列を描画する画像
text 描画する文字列
x 文字列を描画するx座標(※原点は左上)
y 文字列を描画するy座標(※原点は左上)
size 文字列の大きさ
color 文字色
output 関数内で画像を表示するか否か

最後に文字列を描画したあとの画像を返します。


文字色にはredやblueなどのように名前で指定することも出来ますし、カラーコードでも指定できます。

ただし、カラーコードは普通とは順番が違います。
普通は#RGBですが、PILでは#BGRのように逆になっています。

使い方

inputJP(WINDOW_NAME, base, '艦隊これくしょん', 200, 200, 100, '#fff', 1)

最初に用意したbase画像の (x, y) = (200, 200) の位置に大きさ100の白文字で「艦隊これくしょん」を描画します。
outputが1なので関数内で画像を画面に出力します。


base画像に文字を描画したものを新たな画像として変数に格納することも可能です。

temp = inputJP(WINDOW_NAME, base, '艦隊これくしょん', 200, 200, 100, '#fff', 1)


複数行に文字列を描画したいときは1行ずつinputJPで描画していきます。

temp = inputJP(WINDOW_NAME, base, '艦隊これくしょん', 200, 200, 100, '#fff', 0)
temp = inputJP(WINDOW_NAME, temp, 'Fleet Collection', 220, 300, 100, '#fff', 0)
temp = inputJP(WINDOW_NAME, temp, '艦これアーケード', 220, 400, 100, '#fff', 0)
temp = inputJP(WINDOW_NAME, temp, '1234567890', 280, 500, 100, '#fff', 1)

改行文字(\n)で改行することもできますが、左揃えになってしまいます。

とはいえ、文字列を中央揃えにする方法はggれば出てくるので、それを組み込んでいけば一行で書けそうです。

ただし文字色や大きさを変えたいときは当然上記のように一行ずつ書く必要があります。


最後の行以外はoutputの値を0にして、無駄に画面出力しないようにしておきます。



以上、手軽(?)に日本語を描画できる関数でした。