opnecvで取得したimageをtkのcanvasに表示させたいと考えております。googleで色々検索しましたが、tkに貼るには変換が必要であることまでは分かり、変換して貼ってみましたが何も表示されていないです。色々間違えているとは思いますが、ご確認頂ければと思います。
動作は、1.File->Openを押す。2.filedialogで画像ファイルを選ぶ。3.選んだ画像がcanvas上に表示される。と言う流れを期待しております。
python
1import numpy as np 2import tkinter as tk 3import tkinter.filedialog as fd 4from PIL import Image,ImageTk 5import cv2 6 7class mainApp(tk.Frame): 8 def __init__(self,master): 9 super().__init__(master,height=500,width=800) 10 self.pack() 11 self.create_widgets() 12 13 def create_widgets(self): 14 #メニュー 15 menubar = tk.Menu(self) 16 menu1 = tk.Menu(menubar,tearoff=False) 17 menu1.add_command(label="open", command=self.file_open) 18 menubar.add_cascade(label='File',menu=menu1) 19 self.master["menu"] = menubar 20 21 # 画像表示エリア 22 image_frame = tk.Frame(self,width=400,height=400) 23 image_frame.propagate(False) 24 image_frame.place(x=300,y=50) 25 image_yscrollbar = tk.Scrollbar(image_frame) 26 image_yscrollbar.pack(side=tk.RIGHT,fill=tk.Y) 27 image_xscrollbar = tk.Scrollbar(image_frame,orient=tk.HORIZONTAL) 28 image_xscrollbar.pack(side=tk.BOTTOM,fill=tk.X) 29 self.image_canvas = tk.Canvas(image_frame,\ 30 xscrollcommand=image_xscrollbar.set,yscrollcommand=image_yscrollbar.set) 31 self.image_canvas.pack(side=tk.TOP, fill=tk.BOTH) 32 image_xscrollbar["command"] =self.image_canvas.xview 33 image_yscrollbar["command"] =self.image_canvas.yview 34 35 def file_open(self): 36 #fileを選択 37 image_file_path = str(get_file_path("画像ファイルを選択してください")) 38 #imageを読み込む 39 img_cv = imread(image_file_path) 40 img_tk = img_fromCv_toTk(img_cv) 41 self.image_canvas.create_image(0,0,image=img_tk,anchor='nw') 42 43# Fileのdialogを呼び出し、Pathを返す関数 44def get_file_path(stitle): 45 in_path = fd.askopenfilename( 46 title = stitle 47 ) 48 return in_path 49# filePathで指定されたイメージをよみこみimgを返す関数 50def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8): 51 try: 52 n = np.fromfile(filename, dtype) 53 img = cv2.imdecode(n, flags) 54 return img 55 except Exception as e: 56 print(e) 57 return None 58# OpenCVで読み込まれたイメージをtkフォーマットに変換する関数 59def img_fromCv_toTk(image_cv): 60 image_rgb = cv2.cvtColor(image_cv, cv2.COLOR_BGR2RGB) 61 image_pil = Image.fromarray(image_rgb) 62 image_tk = ImageTk.PhotoImage(image_pil) 63 return image_tk 64 65root = tk.Tk() 66app = mainApp(root) 67app.mainloop()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/01 04:26