Using OpenCV with Tkinter

前端 未结 2 938
既然无缘
既然无缘 2020-11-29 03:18

I\'m writing a program that needs to display a video stream in a Tkinter window. Since there will also be buttons for performing various functions, I\'m using grid to organi

2条回答
  •  青春惊慌失措
    2020-11-29 03:46

    This should work:

    import numpy as np
    import cv2
    import Tkinter as tk
    import Image, ImageTk
    
    #Set up GUI
    window = tk.Tk()  #Makes main window
    window.wm_title("Digital Microscope")
    window.config(background="#FFFFFF")
    
    #Graphics window
    imageFrame = tk.Frame(window, width=600, height=500)
    imageFrame.grid(row=0, column=0, padx=10, pady=2)
    
    #Capture video frames
    lmain = tk.Label(imageFrame)
    lmain.grid(row=0, column=0)
    cap = cv2.VideoCapture(0)
    def show_frame():
        _, frame = cap.read()
        frame = cv2.flip(frame, 1)
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img)
        lmain.imgtk = imgtk
        lmain.configure(image=imgtk)
        lmain.after(10, show_frame) 
    
    
    
    #Slider window (slider controls stage position)
    sliderFrame = tk.Frame(window, width=600, height=100)
    sliderFrame.grid(row = 600, column=0, padx=10, pady=2)
    
    
    show_frame()  #Display 2
    window.mainloop()  #Starts GUI
    

    First of all, you have the line tk.Label(imageFrame, image=show_frame()).grid(row=0, column=0, padx=10, pady=2), and since show_frame() doesn't return anything, you've set image to None. Second of all, you need to make sure you lmain.grid(), otherwise lmain won't show.

    If you want to have two displays one on top of the other, you could do something like this:

    import numpy as np
    import cv2
    import Tkinter as tk
    import Image, ImageTk
    
    #Set up GUI
    window = tk.Tk()  #Makes main window
    window.wm_title("Digital Microscope")
    window.config(background="#FFFFFF")
    
    #Graphics window
    imageFrame = tk.Frame(window, width=600, height=500)
    imageFrame.grid(row=0, column=0, padx=10, pady=2)
    
    #Capture video frames
    
    cap = cv2.VideoCapture(0)
    
    def show_frame():
        _, frame = cap.read()
        frame = cv2.flip(frame, 1)
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img)
        display1.imgtk = imgtk #Shows frame for display 1
        display1.configure(image=imgtk)
        display2.imgtk = imgtk #Shows frame for display 2
        display2.configure(image=imgtk)
        window.after(10, show_frame) 
    
    display1 = tk.Label(imageFrame)
    display1.grid(row=1, column=0, padx=10, pady=2)  #Display 1
    display2 = tk.Label(imageFrame)
    display2.grid(row=0, column=0) #Display 2
    
    #Slider window (slider controls stage position)
    sliderFrame = tk.Frame(window, width=600, height=100)
    sliderFrame.grid(row = 600, column=0, padx=10, pady=2)
    
    show_frame() #Display
    window.mainloop()  #Starts GUI
    

提交回复
热议问题