お世話になっております。Python初心者で食料品の検品プログラム作成にチャレンジしている者です。
Tkinterを初めて利用しているのですが、実装でつまづいてしまいました。
勉強不足・調査不足の面もございますが、是非有識者のみなさまの知恵をお借りしたいです。
やりたいことは、
まずカメラを起動し、写真とります。
その後、撮影した写真を分析するための関数に渡して、分析をかけます。
その結果をテキストボックスとして表示したいです。
2点質問させて頂きたいです。
①下記のソースコードを実行した場合に、分析のために定義している関数「analyze_image」が未定義とされてしまう原因と解決のための実装方法
②分析結果をテキストボックスに出力する方法
①下記のソースコードを実行した場合に、分析のために定義している関数「analyze_image」が未定義とされてしまう原因と解決のための実装方法
関数を定義しているのに、なぜでしょうか。。。 → クラスメソッドとして定義出来ていないため??
クラスメソッドとして定義する際の実装方法をご教示頂けますと幸甚です。
File "<ipython-input-1-e1d6fa968c2c>", line 109, in press_snapshot_button result = analyze_image(pic_name) NameError: name 'analyze_image' is not defined
②分析結果をテキストボックスに出力する方法
下記のコーディングで問題なく、テキストボックス内にanalyze_imageの戻り値が出力されますでしょうか。
また①と関連しますが、記載すべき場所がよく分かっておりません。
加えて、次の写真を撮った場合には、こちらの内容を削除してブランクの状態にしたいのですが、
どのように実装すれば良いでしょうか。
# 表示させたいがどこにどのようにプログラムを書けば良いかわからない self.text.insert(tk.END, result)
以上、拙い文書・初歩的な質問で大変恐縮ですが、
お助けいただけると幸甚です。。。
宜しくお願いします。
#ソースコード全体 import tkinter as tk from tkinter import ttk import cv2 import PIL.Image, PIL.ImageTk from tkinter import font from tkinter import filedialog import time class Application(tk.Frame): def __init__(self,master, video_source=0): super().__init__(master) self.master.geometry("1250x1000") self.master.title("Tkinter with Video Streaming and Capture") # --------------------------------------------------------- # Font # --------------------------------------------------------- self.font_frame = font.Font( family="Meiryo UI", size=15, weight="normal" ) self.font_btn_big = font.Font( family="Meiryo UI", size=20, weight="bold" ) self.font_btn_small = font.Font( family="Meiryo UI", size=15, weight="bold" ) self.font_lbl_bigger = font.Font( family="Meiryo UI", size=45, weight="bold" ) self.font_lbl_big = font.Font( family="Meiryo UI", size=30, weight="bold" ) self.font_lbl_middle = font.Font( family="Meiryo UI", size=15, weight="bold" ) self.font_lbl_small = font.Font( family="Meiryo UI", size=12, weight="normal" ) # --------------------------------------------------------- # Open the video source # --------------------------------------------------------- self.vcap = cv2.VideoCapture( video_source ) self.width = self.vcap.get( cv2.CAP_PROP_FRAME_WIDTH ) self.height = self.vcap.get( cv2.CAP_PROP_FRAME_HEIGHT ) # --------------------------------------------------------- # Widget # --------------------------------------------------------- self.create_widgets() # --------------------------------------------------------- # Canvas Update # --------------------------------------------------------- self.delay = 15 #[mili seconds] self.update() def create_widgets(self): #Frame_Camera self.frame_cam = tk.LabelFrame(self.master, text = 'Camera', font=self.font_frame) self.frame_cam.place(x = 10, y = 10) self.frame_cam.configure(width = self.width -90, height = self.height - 50) self.frame_cam.grid_propagate(0) #Canvas self.canvas1 = tk.Canvas(self.frame_cam) self.canvas1.configure( width= self.width -90 , height=self.height - 100) self.canvas1.grid(column= 0, row=0,padx = 10, pady=10) # Frame_Button self.frame_btn = tk.LabelFrame( self.master, text='Control', font=self.font_frame ) self.frame_btn.place( x=10, y=680 ) self.frame_btn.configure( width=self.width - 90, height=120 ) self.frame_btn.grid_propagate( 0 ) #Snapshot Button self.btn_snapshot = tk.Button( self.frame_btn, text='Snapshot', font=self.font_btn_big) self.btn_snapshot.configure(width = 15, height = 1, command=self.press_snapshot_button) self.btn_snapshot.grid(column=0, row=0, padx=30, pady= 10) # Close Button self.btn_close = tk.Button( self.frame_btn, text='Close', font=self.font_btn_big ) self.btn_close.configure( width=15, height=1, command=self.press_close_button ) self.btn_close.grid( column=1, row=0, padx=20, pady=10 ) # Text Boxの書き方がよく分かりません。。。。 # テキストボックスの作成 txtbox = tk.Entry(width=150) txtbox.place(x=37, y=750) def update(self): #Get a frame from the video source _, frame = self.vcap.read() frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame)) #self.photo -> Canvas self.canvas1.create_image(0,0, image= self.photo, anchor = tk.NW) self.master.after(self.delay, self.update) def analyze_img(self, pic_name): img_test = cv2.imread(pic_name, cv2.IMREAD_GRAYSCALE) result = "実装中" return result def press_snapshot_button(self): # Get a frame from the video source _, frame = self.vcap.read() frame1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) pic_name = "frame-" + time.strftime( "%Y-%d-%m-%H-%M-%S")+ ".jpg" cv2.imwrite(pic_name, cv2.cvtColor( frame1, cv2.COLOR_BGR2RGB ) ) # analyze_imageが未定義のエラーになる result = analyze_img(pic_name) # 表示させたいがどこにどのようにプログラムを書けば良いかわからない self.text.insert(tk.END, result) def press_close_button(self): self.master.destroy() self.vcap.release() def main(): root = tk.Tk() app = Application(master=root)#Inherit app.mainloop() if __name__ == "__main__": main()
回答1件
あなたの回答
tips
プレビュー