質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3505閲覧

pillowで日本語字幕を表示させようとするとフォント指定でエラーが発生してしまう。

genosuke

総合スコア12

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/14 08:45

編集2020/01/16 07:58

前提・実現したいこと

OpenCVとKerasを利用して、webカメラに写されたイラストの顔を検知し判別するプログラムを作りました。
イラストを判別したときに作品名を画面上に日本語で表示させたいと思い、OpenCVは日本語に対応していないとのことなのでpillowを使って表示させようと思ったのですが、フォントのパスの部分
fon = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', 27)
でエラーが発生してしまいます。
試しに画像に日本語文字を入れた際に同様のフォントパスを指定してみるとうまく実行できましたのでフォントパスに問題はないと思います。
どなたか解決方法がわかる方、教えていただきたいです。。

イラストの顔を判別するプログラムコードは以下のホームページとほぼ同じ物を書いています
↓                ↓
https://ai-coordinator.jp/real-time-person-detection

発生している問題・エラーメッセージ

Traceback (most recent call last): File "C:\Users\Taisei\Anaconda3\envs\opencv\lib\site-packages\PIL\ImageDraw.py", line 309, in draw_text mask, offset = font.getmask2( AttributeError: 'ImageFont' object has no attribute 'getmask2' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "check3.py", line 86, in <module> main() File "check3.py", line 60, in main draw.text((10, 10), u'これはモナリザです。', fill=(255, 0, 0), fon=fon) File "C:\Users\Taisei\Anaconda3\envs\opencv\lib\site-packages\PIL\ImageDraw.py", line 352, in text draw_text(ink) File "C:\Users\Taisei\Anaconda3\envs\opencv\lib\site-packages\PIL\ImageDraw.py", line 330, in draw_text **kwargs File "C:\Users\Taisei\Anaconda3\envs\opencv\lib\site-packages\PIL\ImageFont.py", line 140, in getmask return self.font.getmask(text, mode) UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-9: ordinal not in range(256) [ WARN:0] terminating async callback

該当のソースコード

python

1import gakusyu2 as face 2import sys, os 3from keras.preprocessing.image import load_img, img_to_array 4import numpy as np 5from PIL import Image, ImageDraw, ImageFont 6import cv2 7import time 8 9cascade_path = 'C:\Users\Taisei\Anaconda3\envs\OpenCV\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml' 10cascade = cv2.CascadeClassifier(cascade_path) 11cam = cv2.VideoCapture(1) 12color = (255, 0, 255) 13 14image_size = 32 15categories = ["monariza","Lady with an Ermine","Girl with a Pearl Earring"] 16 17def main(): 18 19 while(True): 20 ret, frame = cam.read() 21 facerect = cascade.detectMultiScale(frame, scaleFactor=1.3, minNeighbors=2, minSize=(10, 10)) 22 23 frame_img = Image.fromarray(np.uint8(frame)) # numpy.ndarray to Image 24 draw = ImageDraw.Draw(frame_img) 25 26 fon = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', 27) 27 28 for rect in facerect: 29 cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2) 30 x = rect[0] 31 y = rect[1] 32 width = rect[2] 33 height = rect[3] 34 35 cv2.imwrite("frontalface.png", frame) 36 img = cv2.imread("frontalface.png") 37 38 dst = img[y:y+height, x:x+width] 39 cv2.imwrite("output.png", dst) 40 cv2.imread("output.png") 41 X = [] 42 43 img = load_img("output.png", target_size=(image_size,image_size)) 44 in_data = img_to_array(img) 45 46 X.append(in_data) 47 X = np.array(X) 48 X = X.astype("float") / 256 49 50 model = face.build_model(X.shape[1:]) 51 model.load_weights("C:\python code\system2.hdf5") 52 53 pre = model.predict(X) 54 print(pre) 55 if pre[0][0] > 0.95: 56 print(categories[0]) 57 text = categories[0] 58 font = cv2.FONT_HERSHEY_PLAIN 59 cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, color, 2, cv2.LINE_AA) 60 draw.text((10, 10), u'これはモナリザです。', fill=(255, 0, 0), fon=fon) 61 elif pre[0][1] > 0.95: 62 print(categories[1]) 63 text = categories[1] 64 font = cv2.FONT_HERSHEY_PLAIN 65 cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, color, 2, cv2.LINE_AA) 66 draw.text((10, 10), u'これは真珠の耳飾りです。', fill=(255, 0, 0), fon=fon) 67 elif pre[0][2] > 0.95: 68 print(categories[2]) 69 text = categories[2] 70 font = cv2.FONT_HERSHEY_PLAIN 71 cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, color, 2, cv2.LINE_AA) 72 draw.text((10, 10), u'これは牛乳を注ぐ女です。', fill=(255, 0, 0), fon=fon) 73 74 cv2.imshow("Show FLAME Image", frame) 75 #time.sleep(0.1) 76 77 k = cv2.waitKey(1) 78 79 if k == ord('q'): 80 break 81 82 cam.release() 83 cv2.destroyAllWindows() 84 85if __name__ == '__main__': 86 main()

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

バージョンを確認したところ
Keras 2.3.1
TensorFlow 2.0.0
OpenCV 4.1.0
Python 3.6.8 
pillow 6.2.1
でした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/01/14 11:15

・リンクは「リンクの挿入」で記入してください。 ・モジュールのバージョンを追記してください。
genosuke

2020/01/15 09:57

ご指摘ありがとうございます! 修正しておきます!
guest

回答1

0

ベストアンサー

【追記】
0. ImageFont.truetypeのフォント指定の際にはバックスラッシュのエスケープがなくても実行できました。
失礼しました。

  1. 下記のようにdraw.textの前にフォントを設定すれば良いかと思います。

Python

1draw.font = ImageFont.truetype('C:\windows\Fonts\meiryo9.ttc', 27) 2draw.text((30, 100), 'あいうえお', (0, 0, 255))

または下記でも良いかと。

Python

1font = ImageFont.truetype('C:\windows\Fonts\meiryo.ttc', 27) 2draw.text((30, 100), 'あいうえお', font=font, fill=(0, 0, 255))

※フォントを設定しないで日本語を描画しようとしたら質問と同じエラーが出ました。


下記で正しくフォントが設定されていないのではないでしょうか?
(エスケープシーケンスが必要かと思います)

Python

1fon = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', 27)

投稿2020/01/15 11:08

編集2020/01/16 10:38
meg_

総合スコア10579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

genosuke

2020/01/16 07:52

今のフォントのまま画像に文字を書き込むプログラムを作成したところうまく実行されたのでフォントのパスは間違っていないと思います。。
meg_

2020/01/16 09:07

日本語が表示されたということですか?
genosuke

2020/01/16 09:52

そうですね!
meg_

2020/01/16 10:41

fonではなくfontですね。「fon」では駄目だとのエラーが出れば分かりやすいのですが、何故か出ませんね。。
genosuke

2020/01/17 06:29

ご指摘ありがとうございます! draw.font = ImageFont.truetype('C:\windows\Fonts\meiryo.ttc', 27)の方で実行してみたところ エラーは発生しなくなりましたが、日本語文字は表示されませんでした。。 プログラムの組み方に問題があるのですかね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問