質問するログイン新規登録

Q&A

解決済

1回答

424閲覧

カメラ撮影してPillowで書き込んだ画像をリサイズして表示更新したい

Ta2S

総合スコア5

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/10/22 16:09

0

0

実現したいこと

カメラで撮影した画像に、Pillowで四角を書き込んだ画像を作成しましたが、リサイズして表示更新できませんでした。
リサイズして表示更新したいです。アドバイスよろしくお願いします。

前提

Python+PySimpleGUI+OpenCV+Pillow
前質問「Pythonでの画像処理の計算速度を改善したい」で回答していただいた結果を元に、本プログラムを修正しています。
https://teratail.com/questions/lb5d2h1lh5djr2

カメラで撮影した画像は、下記コードで、その都度リサイズして、表示更新できています。
frame_resized2 = cv2.resize(frame2, (1280, 1024))
window['-IMAGE-'].update(data=cv2.imencode('.png', frame_resized2)[1].tobytes())

(枠付)反射画像を保存で保存した画像は、フォト、ペイント、HoneyViewで正常に表示でき、
プロパティを確認しても、大きさ4656x3496、ビットの深さ24で、特に問題は無いように見えます。
frame1.save("C:/code/py311/trial/Angleframe1.png")

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

frame_resized1 = cv2.resize(frame1, (1280, 1024)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cv2.error: OpenCV(4.8.0) :-1: error: (-5:Bad argument) in function 'resize' > Overload resolution failed: > - src is not a numpy array, neither a scalar > - Expected Ptr<cv::UMat> for argument 'src'

該当のソースコード

# ■■■■■■■■■■欠点合成表示用■■■■■■■■■■ pos_list = np.argwhere(mask1 | mask2).tolist() # 反射画像に対し欠点を四角で囲む書き込み ut_now = datetime.datetime.now() print(ut_now, '欠点を四角で囲む') frame1 = Image.fromarray(pixels1) # frame1 = Image.fromarray(pixels1, 'RGB') draw = ImageDraw.Draw(frame1) for pos in pos_list: y, x = pos draw.rectangle((x-50, y-50, x+50, y+50), outline="red", width=5) # (枠付)反射画像を保存 ut_now = datetime.datetime.now() print(ut_now, '画像を保存') frame1.save("C:/code/py311/trial/Angleframe1.png") # (枠付)反射画像のリサイズ(画面に収まるようにリサイズ) ut_now = datetime.datetime.now() print(ut_now, '(枠付)反射画像をリサイズ') frame_resized1 = cv2.resize(frame1, (1280, 1024)) # frame1 = cv2.imread(frame1) # 画像データに戻す # frame_resized1 = frame1.resize((1280, 1024)) # (枠付)反射画像の更新 ut_now = datetime.datetime.now() print(ut_now, '(枠付)反射画像に更新') window['-IMAGE-'].update(data=cv2.imencode('.png', frame_resized1)[1].tobytes()) # image_bytes1 = frame_resized1.tobytes() # window['-IMAGE-'].update(data=image_bytes1) window.Refresh()

試したこと

ソースコードの # で書いている部分に変えて、試してみました。

画像データに戻すを追加してみた

frame1 = cv2.imread(frame1)

frame1 = cv2.imread(frame1) # 画像データに戻す ^^^^^^^^^^^^^^^^^^

 TypeError: Can't convert object to 'str' for 'filename'

Pillowでリサイズする、に変更してみた

frame_resized1 = frame1.resize((1280, 1024))

window['-IMAGE-'].update(data=cv2.imencode('.png', frame_resized1)[1].tobytes()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

 cv2.error: OpenCV(4.8.0) 👎 error: (-5:Bad argument) in function 'imencode'
> Overload resolution failed:
> - img is not a numpy array, neither a scalar
> - Expected Ptrcv::UMat for argument 'img'

Pillowでリサイズし、バイトに変換する、に変更してみた

frame_resized1 = frame1.resize((1280, 1024))
image_bytes1 = frame_resized1.tobytes()
window['-IMAGE-'].update(data=image_bytes1)

 暴走し、VSCodeを強制終了

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

ここにより詳細な情報を記載してください。

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

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

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

melian

2023/10/22 17:18

frame1 を numpy.ndarray に変換してリサイズしてみてはどうでしょうか。 frame_resized1 = cv2.resize(np.array(frame1), (1280, 1024)) window['-IMAGE-'].update(data=cv2.imencode('.png', frame_resized1)[1].tobytes())
Ta2S

2023/10/22 20:43

melian様、回答ありがとうございます。 エラーは出なくなり、(枠付)反射画像をリサイズ、表示更新できるようになりました。 赤枠が、保存が赤枠、表示が青枠、になりますが、なんとかなりそう。 np理解できていないので応用しづらく、避けようとしてしまう・・・ リサイズデータを保存してリサイズ前と目視比較できるようにしようとしたら、'save' 属性がありません、エラーが出ました。 frame_resized1.save("C:/code/py311/trial/Angleframe1r1.png") frame_resized1.save("C:/code/py311/trial/Angleframe1r1.png") ^^^^^^^^^^^^^^^^^^^ AttributeError: 'numpy.ndarray' object has no attribute 'save'. Did you mean: 'ravel'? ほんと、教えていただいたことを理解できていなくてすみません。
Ta2S

2023/10/23 21:02

jbpb0様、回答ありがとうございます。 少し理解できて来たように思います。 Numpyデータのままでは、Pillowでsave保存できない。 OpenCVとNumpyとPillowの変換時に、RGBとBGRの並びが変わったり変わらなかったりする。 BGRの並びの時に赤枠で書き込んだため、RGBに戻して表示更新すると青枠になっていた。 青枠で書き込み、RGBに戻して表示更新すると赤枠になり、本来の目的の色で正常に表示される。 もしくは、RGBに戻してから赤枠を書き込み、表示更新の部分を修正する。 処理毎に、RGBなのかBGRなのか、把握しておく必要がある。 処理の後ろに、#RGB、#BGR、#RGB=>BGR、などとコメントを入れて、間違えないようにしていこうと思います。 間違った理解をしていたら、指摘お願いします。
Ta2S

2023/10/24 17:26

解決済にできない・・・ベストアンサーボタンも見つからない・・・ まだ回答がついていません、の表示が関係しているのでしょうか?
Ta2S

2023/10/25 21:06

回答ではなく、コメントとして頂いているので、解決済にできず、ベストアンサーボタンも見つからないと理解しました。 #BGRなどとコメントを入れていくと、平均値の計算部分もBGR用に修正していないことにも気づきました。 また、まだ修正途中ですが、エラー無く保存動作できるようになったことで、被検査物を半分撮影範囲に入った状態で、間違って検査開始ボタンを押してしまうと、全面塗りつぶし描画になり、1分程度無反応になってしまう問題も発見できました。
jbpb0

2023/10/26 08:02

質問への対策はmelianさんのコメントです その内容を質問者さんが自分で回答に書いて、「自己解決」にしたら、いかがでしょうか
guest

回答1

0

自己解決

melian様、jbpb0様、すみません、自己解決にさせていただきます。

# ■■■■■■■■■■欠点合成表示用■■■■■■■■■■ pos_list = np.argwhere(mask1 | mask2).tolist() # BGR # 反射画像に対し欠点を四角で囲む書き込み ut_now = datetime.datetime.now() print(ut_now, '欠点を四角で囲む') frame1 = Image.fromarray(pixels1) # BGR draw = ImageDraw.Draw(frame1) # BGR for pos in pos_list: y, x = pos draw.rectangle((x-50, y-50, x+50, y+50), outline="blue", width=5) # BGRのRにblueとして書込 # (枠付)反射画像のリサイズ(画面に収まるようにリサイズ) ut_now = datetime.datetime.now() print(ut_now, '(枠付)反射画像をリサイズ') frame_resized1 = cv2.resize(np.array(frame1), (1280, 1024)) # BGR # (枠付)反射画像の更新 写真画像をBGR→RGB変換して表示 ut_now = datetime.datetime.now() print(ut_now, '(枠付)反射画像に更新') window['-IMAGE-'].update(data=cv2.imencode('.png', frame_resized1)[1].tobytes()) # BGR=>RGB表示 window.Refresh()

Pillowで四角を書き込んだ後のBGRイメージの、簡単なコードでのRGB変換保存を少し調べてもできなかったので、画像を保存箇所を削除しています。
(途中経過の確認用で、本プログラムで必要のないものでしたので。)
撮影画像によってはPillow書き込みで長時間無反応になるため、四角を書き込むコードのNumpy化に挑戦しようと思います。
Numpy化すれば、Pillowとの変換等に頭を悩ます必要が無くなるのではないか、と期待しています。
拒否感のあったNumpy使用を進めて行こうという気持ちに再度なれました。ありがとうございました。

投稿2023/10/28 01:57

Ta2S

総合スコア5

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問