Show webcam sequence TkInter

后端 未结 5 2118
误落风尘
误落风尘 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:34

    The solution proposed by Kieleth worked well for me in a Jupyter notebook. However, I would suggest you destroy root and release cap after the mainloop. Without doing that, the kernel will have to be reset every time.

    0 讨论(0)
  • 2020-12-08 06:37

    Kieleth's updated code for py3.7

    import PIL
    from PIL import Image,ImageTk
    import pytesseract
    import cv2
    from tkinter import *
    width, height = 800, 600
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
    
    root = Tk()
    root.bind('<Escape>', lambda e: root.quit())
    lmain = Label(root)
    lmain.pack()
    
    def show_frame():
        _, frame = cap.read()
        frame = cv2.flip(frame, 1)
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = PIL.Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img)
        lmain.imgtk = imgtk
        lmain.configure(image=imgtk)
        lmain.after(10, show_frame)
    
    show_frame()
    root.mainloop()
    
    0 讨论(0)
  • 2020-12-08 06:40

    I have done it and working successfully. Here is the Link

    I havent assigned button to show the frame but you can assign a button and run to get your answer. I know the use of global variable is a bad practice but still i am using it. Hope it helps.

    0 讨论(0)
  • 2020-12-08 06:42

    A simple version of camera capture using OpenCv and Tkinter:

    import Tkinter as tk
    import cv2
    from PIL import Image, ImageTk
    
    width, height = 800, 600
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
    
    root = tk.Tk()
    root.bind('<Escape>', lambda e: root.quit())
    lmain = tk.Label(root)
    lmain.pack()
    
    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)
    
    show_frame()
    root.mainloop()
    

    You will need to download and install PIL...

    UPDATE:

    ... and OpenCV for this to work.

    To Install PIL, run the following command in your Terminal/Command Prompt:

    pip install Pillow or python -m pip install Pillow

    To Install OpenCV, run the following command in your Terminal/Command Prompt:

    pip install opencv-python or python -m pip install opencv-python

    0 讨论(0)
  • 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()
    
    0 讨论(0)
提交回复
热议问题