#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)` перед определением функции, но я не понимаю, чем это отличается?