Как сделать эту программу Tkinter и OpenCV более масштабируемой?

#python #opencv #tkinter

Вопрос:

У меня есть эта часть моей программы, чтобы показывать ленту веб-камеры в окне Tkinter:

 from tkinter import *
from PIL import Image, ImageTk
import cv2

root = Tk()

def show_frames():
    cv2image = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2RGB)
    img = Image.fromarray(cv2image)
    imgtk = ImageTk.PhotoImage(image=img)
    label.imgtk = imgtk
    label.configure(image=imgtk)
    label.after(20, show_frames)


label = Label(root)
label.grid()
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

show_frames()
root.mainloop()
 

Вся программа становится довольно длинной и трудной для наивности, и я пытаюсь разделить исходный код на несколько файлов. Однако у меня есть проблемы даже с этой основной частью моего кода. Я попытался ввести show_frames() ограничение аргумента, и он запускает функцию один раз и прерывается на втором кадре.

Затем я попробовал это:

 from tkinter import *
from PIL import Image, ImageTk
import cv2

root = Tk()

def show_frames():
    cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
    cv2image = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2RGB)
    img = Image.fromarray(cv2image)
    imgtk = ImageTk.PhotoImage(image=img)
    label.imgtk = imgtk
    label.configure(image=imgtk)
    label.after(20, show_frames)

label = Label(root)
label.grid()

show_frames()
root.mainloop()
 

В этом я не уверен, как «загрузить» кадр на экран.

Ответ №1:

Вам нужно выйти cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) за show_frames рамки своей функции.

 from tkinter import *
from PIL import Image, ImageTk
import cv2

root = Tk()

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

def show_frames():
    cv2image = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2RGB)
    img = Image.fromarray(cv2image)
    imgtk = ImageTk.PhotoImage(image=img)
    label.imgtk = imgtk
    label.configure(image=imgtk)
    label.after(20, show_frames)

label = Label(root)
label.grid()

show_frames()
root.mainloop()
 

Кроме того, не используйте подстановочный * знак, это может вызвать у вас проблемы в будущем.

Комментарии:

1. Действительно ли это отличается от first code that I put in? I understand that cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)` перед определением функции, но я не понимаю, чем это отличается?