【发布时间】:2021-03-14 13:44:02
【问题描述】:
我正在尝试显示视频,并且使用示例/解决方案来解决有关如何在 Tkinter 上播放视频的问题似乎无法实现流畅和快速的渲染。
例如:
frame = self.vid_cap.read()
frame = cv2.resize(frame, (696, 486))
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
self.latest_img_ = Image.fromarray(frame)
self.latest_img_ = ImageTk.PhotoImage(image=self.latest_img_)
self.canvas.create_image(0, 0, anchor="nw", image=self.latest_img_)
上面的代码可以工作,但是视频太慢了,即使使用self.canvas.after(1, self.video_loop_) 之类的代码也是如此。经过一些基准测试,结果是以下行:
self.latest_img_ = ImageTk.PhotoImage(image=self.latest_img_)
无论我在四核 mac 还是 12 核设备上运行代码,都需要 9ms ~ 100ms,而上面的整个代码(从捕获到将 numpy 数组转换为图像)只需要 0ms 到 1ms .
有什么比ImageTk.PhotoImage更快的替代方案?
【问题讨论】:
-
您是每 1 毫秒创建一个新图像还是重复使用同一个画布对象?这有很大的不同。
-
@HenryYik 我认为没有任何东西被重用(除了 Canvas 对象)。我在问题中包含的部分代码与我在项目中的代码几乎相同。你能分享一个如何重用图像对象的例子吗?
-
请提供minimal reproducible example。 Tkinter 本身不应该用于显示视频,而是尝试着看集成其他小部件
-
对于那个尺寸的图像,
ImageTk.PhotoImage()在我的 MacBook Pro 上需要 823 微秒,即不到一毫秒。不知道发生了什么。
标签: python tkinter python-imaging-library tkinter-canvas opencv-python