Show webcam sequence TkInter Show webcam sequence TkInter tkinter tkinter

Show webcam sequence TkInter


A simple version of camera capture using OpenCv and Tkinter:

import Tkinter as tkimport cv2from PIL import Image, ImageTkwidth, height = 800, 600cap = 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


Kieleth's updated code for py3.7

import PILfrom PIL import Image,ImageTkimport pytesseractimport cv2from tkinter import *width, height = 800, 600cap = 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()


Try this code:

from collections import dequeimport cv2from PIL import Image, ImageTkimport timeimport Tkinter as tkdef 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()