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

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

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

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

Python 3.x

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

解決済

1回答

1102閲覧

tkinterデータの画像をopencvへ変換するための関数

asahi555

総合スコア7

OpenCV

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

Python 3.x

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

1クリップ

投稿2023/02/02 14:59

実現したいこと

tkinterデータの画像をOpenCVデータに変更する。

前提

画像の編集に際しキャンバスへ画像を表示するため、tkinterデータを使用していますが、編集自体はopencvを使うことが多く関数を使用しデータの変換を行いたいと考えております。

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

Exception in Tkinter callback TkCv() Pixel = list(Tk_img.get(x, y)) AttributeError: 'PhotoImage' object has no attribute 'get'

該当のソースコード

python

1 2#画像の読み込み 3#======================================== 4img2 = cv2.imread('pic/nicochan.png') 5H2, W2 = img.shape[:2] 6 7#画像の配置 8#======================================== 9rim2 = cv2.cvtColor(Img2, cv2.COLOR_BGR2RGB) 10pim2 = Image.fromarray(rim2) 11Tk_img = ImageTk.PhotoImage(pim2) 12 13cvs2 = tk.Canvas(frm, width=1007, height=1007) 14cvs2.place(x=5, y=5) 15cvs2.create_image(0, 0, image=Tk_img, anchor=tk.NW, tag="Pic_I") 16 17#画像データの変更 18#======================================== 19def TkCv():#tk>cv 20 global H2, W2 21 global Tk_img 22 bitmap = [] 23 for y in range(H2): 24 line = [] 25 for x in range(W2): 26 Pixel = list(Tk_img.get(x, y)) 27 line.append(Pixel) 28 bitmap.append(line) 29 cIm_rgb = np.array(bitmap, dtype='uint8') 30 Cv_img = cv2.cvtColor(cIm_rgb, cv2.COLOR_BAYER_BG2BGR) 31 return Cv_img 32 33 34#処理 35#==================== 36root.mainloop() 37cv2.waitKey(0) 38cv2.destroyAllWindows()

試したこと

Pixel = list(Tk_img.get(x, y))部分でのエラーを受け、Tk_imgへglobalをつけ、また高さ、幅に関してもglobalを追加致しました。
ですがなぜget属性が機能していないのかが分かりませんでした。

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

python3.11.1 64-bit

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

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

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

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

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

melian

2023/02/02 17:03

Tk_img は PIL.ImageTk.PhotoImage 型ですので、 Tk_img._PhotoImage__photo.get(x, y) となります。
can110

2023/02/03 00:59

エラーは詳細が分かるように全文(Traceback)を提示ください。 また、提示されている部分的なコードを見る限り問題ないように思います。 第三者が検証、実行できる完全で最小限のコードを提示すると回答得られやすくなります。
guest

回答1

0

ベストアンサー

gettkinter.PhotoImageにはありますがPIL.ImageTk.PhotoImageにはないため提示エラーが発生しているものと思われます。
いっそのことHow can I convert canvas content to an image?に記載のように、キャンバス自体から画像をキャプチャするほうが簡単かもしれません。
ただし

  • たぶん一部の環境(OS)では動作しない
  • ウインドウを小さくしたりなど画像全体が見えていないとだめ

といった制限はあります。

Python

1import tkinter as tk 2import cv2 3import numpy as np 4from PIL import Image, ImageTk, ImageGrab 5 6 7def on_btn(): 8 # キャンバスから画像部分のみをキャプチャ 9 cx, cy = can.winfo_rootx(), can.winfo_rooty() # キャンバスの始点 10 ix, iy = cx+img_x, cy+img_y # 画像の始点 11 img = ImageGrab.grab(bbox=(ix, iy, ix+img_w, iy+img_h)) 12 13 # cv2に変換 14 img = np.array(img, dtype=np.uint8) 15 img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) 16 cv2.imwrite('ret.png', img) 17 18 19root = tk.Tk() 20root.geometry('400x300') 21 22btn = tk.Button(root, text='exec', command=on_btn) 23btn.pack() 24can = tk.Canvas(root, width=300, height=200, bg='gray') 25can.place(x=10, y=50)#,expand = True, fill = tk.BOTH) 26 27img = cv2.imread('temp.png') 28img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 29img = Image.fromarray(img) 30img = ImageTk.PhotoImage(img) 31#print(type(img_pi)) # <class 'PIL.ImageTk.PhotoImage'> 32#print(img_pi.get(0,0)) # AttributeError: 'PhotoImage' object has no attribute 'get' 33 34#img = tk.PhotoImage(file="temp.png") 35#print(type(img)) # <class 'tkinter.PhotoImage'> 36#print(img.get(0,0)) # (255, 255, 255) 37 38img_w,img_h = img.width(), img.height() 39root.update() # キャンバスサイズの取得前に必要 40img_x,img_y = (can.winfo_width()-img_w)//2, (can.winfo_height()-img_h)//2 41 42can.create_image(img_x, img_y, image=img, anchor=tk.NW) # 計算が楽になるように左上基準で座標を指定 43root.mainloop()

投稿2023/02/03 05:10

can110

総合スコア38332

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問