opencv-pythonの日本語の扱いについてメモ

お疲れ様です。

 

PythonOpenCVを使った画像処理のプログラムを書くことが多いのですが、日本語が絡んでくるとうまく動作しないことがよくあります。

その対処法をメモ的に残しておきます。

 

画像読み込み・保存(imread, imwrite)

cv2.imreadで画像を読み込むときやcv2.imwriteで画像を保存するときに、入力したパスに日本語が含まれていると読み込みor保存が正常にできない問題。

対処法は以下の通り。

‐ 画像読み込み

  • PillowのImage.openで読み込み、numpy.ndarrayに変換
  • numpy.fromfilecv2.imdecodeを使用して読み込み

- 画像保存

  • numpy.ndarrayからPillow形式に変換し、Image.saveで保存
  • cv2.imencodeとnumpyのtofileを使用して保存

【参考】

imagingsolution.net

 

文字列書き込み(puttext)

cv2ではputtextを使って画像内に文字を書き込むことができますが、これは英数字のみで日本語を書き込もうとすると文字化けします…。

対処法は以下の通り。

  1. 一度Pillow形式に変換
  2. ImageDrawDrawクラスのインスタンスを作成
  3. textメソッドを使用して文字列書き込み
  4. numpy.ndarrayに戻す

フォントもインストールされているもので日本語対応していれば変更可能です。

Windowsであれば"C:\Windows\Fonts"に格納されているかと思います。

ImageFont.truetypeでフォントのttcファイルとフォントサイズを設定して指定します。

Windowsのフォント格納場所

 

【参考】

monomonotech.jp

 

ウィンドウ表示(namedwindow, imshow)

ウィンドウを開いて画像を表示する機能ですが、ウィンドウタイトルを日本語で書くと文字化けしてしまいます。

OpenCV

調べた限りではcv2の設定で対処する方法はなさそうです。

ウィンドウタイトルのみの問題で画像に関しては普通に表示されるので、使用上は全く問題はないですが…。

どうしても必要という場合はPythonGUIライブラリでウィンドウ表示すればなんとかなります。ただ、クリックイベントなどcv2にある機能はGUIライブラリのイベントを使って個別に作成する必要があるのでそちらも勉強する必要がでてきます。

tkinter」と「wxPython」で作成してみたのでどうしても必要な場合はご参考ください。

コードはこちらを参照↓

github.com

【使用例】

tkinter

wxPython

tkinterのほうはPythonの標準ライブラリなので別でインストールする必要がないのでやるならこちらでしょうか…。

私個人としては、wxPythonに慣れているのでこちらのほうが作りやすいです。