Show webcam sequence TkInter

后端 未结 5 2120
误落风尘
误落风尘 2020-12-08 06:15

I did a program with python, importing the OpenCV\'s libraries. Now, I\'m doing the GUI in Tkinter. I\'m trying to show the webcam in the GUI but I couldn\'t. I put the code

5条回答
  •  伪装坚强ぢ
    2020-12-08 06:48

    Try this code:

    from collections import deque
    import cv2
    from PIL import Image, ImageTk
    import time
    import Tkinter as tk
    
    def quit_(root):
        root.destroy()
    
    def update_image(image_label, cam):
        (readsuccessful, f) = cam.read()
        gray_im = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
        a = Image.fromarray(gray_im)
        b = ImageTk.PhotoImage(image=a)
        image_label.configure(image=b)
        image_label._image_cache = b  # avoid garbage collection
        root.update()
    
    
    def update_fps(fps_label):
        frame_times = fps_label._frame_times
        frame_times.rotate()
        frame_times[0] = time.time()
        sum_of_deltas = frame_times[0] - frame_times[-1]
        count_of_deltas = len(frame_times) - 1
        try:
            fps = int(float(count_of_deltas) / sum_of_deltas)
        except ZeroDivisionError:
            fps = 0
        fps_label.configure(text='FPS: {}'.format(fps))
    
    
    def update_all(root, image_label, cam, fps_label):
        update_image(image_label, cam)
        update_fps(fps_label)
        root.after(20, func=lambda: update_all(root, image_label, cam, fps_label))
    
    
    if __name__ == '__main__':
        root = tk.Tk() 
        image_label = tk.Label(master=root)# label for the video frame
        image_label.pack()
        cam = cv2.VideoCapture(1) 
        fps_label = tk.Label(master=root)# label for fps
        fps_label._frame_times = deque([0]*5)  # arbitrary 5 frame average FPS
        fps_label.pack()
        # quit button
        quit_button = tk.Button(master=root, text='Quit',command=lambda: quit_(root))
        quit_button.pack()
        # setup the update callback
        root.after(0, func=lambda: update_all(root, image_label, cam, fps_label))
        root.mainloop()
    

提交回复
热议问题