首页 > 解决方案 > 如何使这个 Tkinter 和 OpenCV 程序更具可扩展性?

问题描述

我的程序的这一部分用于在 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()

在这个我不确定如何将框架“加载”到屏幕上。

标签: pythonopencvtkinter

解决方案


你需要移到功能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()

另外,不要使用通配符*,它​​可能会在将来给您带来问题。


推荐阅读