python - 如何使这个 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()
在这个我不确定如何将框架“加载”到屏幕上。
解决方案
你需要移到功能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()
另外,不要使用通配符*
,它可能会在将来给您带来问题。
推荐阅读
- qt - 视觉上假装一个小部件有焦点,但实际上没有它
- async-await - 当我们得到响应时,Angular 5 继续迭代
- wordpress - Wordpress - 在某个类别的帖子标题中自动添加作者姓名
- sql-server - 了解动态 SQL
- swift - Alamofire请求中的字符集windows-1251?
- android - Missing Meta data in com.googlecode.libphonenumber:libphonenumber:8.8.2 while building signed APK
- javascript - 单击后突出显示表格行?
- css - Vue js - 制作一种由子组件继承的样式
- flask - Flask 上下文变量在模板中不可用
- android - 回收站视图中的动态图像高度