実現したいこと
カメラで撮影した画像に、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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー