【问题标题】:Inconsistent PIL.ImageTk.PhotoImage() performancePIL.ImageTk.PhotoImage() 性能不一致
【发布时间】:2017-08-01 22:31:13
【问题描述】:

我正在将 numpy 数组(使用 OpenCV 加载的网络摄像头镜头)转换为 Tkinter PhotoImage 对象以在 Tkinter GUI 上显示它们。但是,函数PIL.ImageTk.PhotoImage() 经历了大约 800 毫秒的峰值,导致帧速率严重下降。这是sn-p:

ar = Image.fromarray(frame)
itk = ImageTk.PhotoImage(ar) # *
lbl = Label()
lbl.configure(image=itk)
lbl.image = itk

我测量了标有*的行的执行时间:

Number of runs: 72
Total duration: 11.97 seconds
Longest run: 967.05 milliseconds
Shortest run: 1.03 milliseconds
Average run: 166.25 milliseconds
Median run: 1.2 milliseconds
Standard deviation: 315.63 milliseconds

此外,以下是性能图:

图像的像素数始终相同,我无法生成性能始终较低的条件。

关于如何防止尖峰的任何想法?如果可以预测,跳帧是没有问题的。

PIL 版本 4.0.0 OpenCV 版本 3.0.0 Numpy 版本 1.12.0 Python版本:2.7.12

【问题讨论】:

    标签: python opencv numpy tkinter python-imaging-library


    【解决方案1】:

    虽然我没有找到原因或对此进行修复,但我找到了一种解决方法,它可以让我在没有持续冻结的情况下获得合理的性能。该解决方案分为两部分:

    1) 每个捕获的帧都像以前一样转换为ImageTk.PhotoImage 对象。但是,我也测量了此操作的持续时间。如果花费超过 100 毫秒,则在 GUI 中没有更新帧。

    2) 当一个帧被捕获时,一个新的线程被启动来更新 GUI 图像。即使面临有问题的长时间延迟,这也允许更新新捕获的帧。这些延迟的图像不会显示在 GUI 上,导致一些丢失的帧,这些帧将很快被下一帧替换。这是可行的,因为大多数情况下转换非常快。

    【讨论】:

      猜你喜欢
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      相关资源
      最近更新 更多