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()