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

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

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

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

Python

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

Q&A

2回答

4452閲覧

PythonのOpenCVで日本語出力をしたい

qkazooing

総合スコア22

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/09/15 05:25

編集2022/01/12 10:55

PILを使って出力できることは分かったのですがプログラムがうまく通りません。

text = "テスト" # 描画する文字 fontface = cv2.FONT_HERSHEY_SIMPLEX # フォントの種類 fontscale = 1.0 # 文字のスケール thickness = 2 # 文字の太さ x, y = 50, 50 # ベースラインの始点 image = Image.fromarray(img) draw = ImageDraw.Draw(image) # 文字列を描画した際の大きさを取得する。 (w, h), baseline = cv2.getTextSize(text, fontface, fontscale, thickness) # 文字を囲む矩形を描画する。 cv2.rectangle(img, (x, y - h), (x + w, y + baseline), (0, 0, 255), thickness) # 文字列を描画する。 draw.text((x,y),text,font=ImageFont.truetype("YuGothL.ttc",size=12),fill=(255,0,0))

imgが画像データです。
長方形の中にテストという文字を出したいのですが、長方形だけ出力されて、textのテストが出力されません。
エラーメッセージも特になく困っています。ご教授お願い致します。

追記

class A: def __init___(self): self.img = ""     省略 def draw_text_with_box(img, origin, text, fontsize=20, color="red"): # フォントを作成する。 font = ImageFont.truetype("ipag.ttc", size=fontsize) # 使用フォントは変更してください draw = ImageDraw.Draw(img, mode="RGBA") # テキストの大きさを取得する。 size = draw.textsize(text, font=font) # テキストを囲む矩形を描画する。 draw.rectangle( (origin, (origin[0] + size[0] - 1, origin[1] + size[1] - 1)), outline="black", width=2, ) # テキストを描画する。。 draw.text(origin, text, fill=color, font=font) def name(data) img = Image.fromarray(cv2.cvtColor(data.img, cv2.COLOR_BGR2RGB)) # RGB に並び替え必要 draw_text_with_box(img, (30, 30), text_name, color="blue", fontsize=30) def B(file): img = cv2.imread(file) cv.imshow('image',img) with open(file,'rb') as file_image: source_bytes = file_image.read() data = A() data.img = img image(data) cv2.imshow('image',data.img) def main(): B(file)

一部省略していますが、def nameでtext_nameを取得するためにdataを引数としています。
また、(30,30)の部分を変更するためにものちにdataを使います。

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

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

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

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

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

qkazooing

2020/09/15 06:29

image = Image.fromarray(img) draw = ImageDraw.Draw(image) draw.text...でpillowの機能を使っていると思っていたのですがこれは違うのでしょうか?
tiitoi

2020/09/15 06:31

すみません。質問の意図を勘違いしてました。 pillow で変数 image に描画したけど、もとの変数 img とは別ものなので、img のほうには反映されていないという状態だと思います。
qkazooing

2020/09/15 06:42

元のimgに反映させるにはどのような操作が必要になるのでしょうか(大雑把な質問ですみません)
guest

回答2

0

python

1image = Image.fromarray(img)

この時点で image (PIL.Image)img (ndarray) は別オブジェクトになります。
なので、cv2.rectangle()img のほうに矩形を描画し、Pillow で image にテキストを描画して、img のほうを保存したとしても Pillow で描画したテキストは反映されていない状態になります。

矩形描画も Pillow でできるので、描画は Pillow に統一して、PIL.Image.save() で画像を保存するようにしてはどうでしょうか
矩形描画やテキストの大きさ取得等も Pillow に同等の機能の関数があります。

ImageDraw Module — Pillow (PIL Fork) 7.2.0 documentation

追記

python

1import cv2 2from PIL import Image, ImageDraw, ImageFont 3 4 5def draw_text_with_box(img, origin, text, fontsize=20, color="red"): 6 # フォントを作成する。 7 font = ImageFont.truetype("ipag.ttc", size=fontsize) # 使用フォントは変更してください 8 9 draw = ImageDraw.Draw(img, mode="RGBA") 10 11 # テキストの大きさを取得する。 12 size = draw.textsize(text, font=font) 13 # テキストを囲む矩形を描画する。 14 draw.rectangle( 15 (origin, (origin[0] + size[0] - 1, origin[1] + size[1] - 1)), 16 outline="black", 17 width=2, 18 ) 19 # テキストを描画する。。 20 draw.text(origin, text, fill=color, font=font) 21 22 23img = cv2.imread("sample.png") 24img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # RGB に並び替え必要 25 26draw_text_with_box(img, (30, 30), "にわとり", color="blue", fontsize=30) 27 28img.save("ret.png")

イメージ説明

投稿2020/09/15 06:30

編集2020/09/15 07:08
tiitoi

総合スコア21956

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

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

qkazooing

2020/09/15 06:51

長方形の描画とテキストサイズの取得のコードを教えていただけませんでしょうか? 全くの初心者でどこから手を付けてよいのかわからないので申し訳ありません。
tiitoi

2020/09/15 07:08

矩形付きでテキストを描画するサンプルコードを貼りました
qkazooing

2020/09/15 07:35

draw = ...の部分で numpy.ndarray object has no attribute load というエラーがでてきました。 調べても解決策がわかりませんでした。
tiitoi

2020/09/15 08:07 編集

img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB) で PIL.Image に変換してから関数に渡していますか?
qkazooing

2020/09/16 02:42

返信遅くなり申し訳ありません。 img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))をいれることでエラーはでなくなりました。 しかし右辺のimgを自身が使いたい画像の変数名にすると、エラーは出ないのですが表示が行われません。
tiitoi

2020/09/16 02:44

質問者さんの今のコード及びやりたい事について質問欄を修正して記載していただけますか?
guest

0

こちらを参考にしてみてはいかがでしょうか?

OpenCVで日本語フォントを描写する を関数化する

投稿2020/09/15 06:02

Supernove

総合スコア1154

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問