Matplotlib,使用 imshow 刷新图像更快

2023-12-27

我正在开发一个项目,在该项目上,我必须在 GUI 窗口上绘制 320*250 像素的图像,如果可能的话,每秒绘制 60 次。所以我尝试这样做matplotlib 2.0.2, Python 3.6 and PyQt5(因为我开始了解这些工具并用它来处理另一个项目),按照以下方式:

import sys, random, matplotlib
from PyQt5 import QtCore, QtGui, QtWidgets

matplotlib.use('Qt5Agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt

class SecondWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(SecondWindow, self).__init__(parent)
        self.setupUi(self)

    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(800, 600)

        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        self.axes = self.figure.add_subplot(111)

        self.setLayout(QtWidgets.QVBoxLayout())
        self.layout().addWidget(self.canvas)

        self.initialisationFigure()

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.majFigure)
        self.timer.start(16)

        self.timer2 = QtCore.QTimer(self)
        self.timer2.timeout.connect(self.NumberRefreshPerSecond)
        self.timer2.start(1000)

    def NumberRefreshPerSecond(self):
        print(self.count)
        self.count = 0

    def majFigure(self):
        self.count = self.count + 1
        self.plot.set_data([[random.random() for x in range(1, 320)] for y in range(1, 250)])
        # self.canvas.draw()
        self.axes.draw_artist(self.axes.patch)
        self.axes.draw_artist(self.plot)
        self.canvas.update()
        self.canvas.flush_events()

    def initialisationFigure(self):
        self.plot = self.axes.imshow([[random.random() for x in range(1,320)] for y in range(1,250)], interpolation='none')
        self.count = 0
        self.canvas.draw()

    def closeEvent(self, event):
        self.timer.stop()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    form = SecondWindow()
    form.show()
    sys.exit(app.exec_())

我进行了优化,就像我可以关闭插值,并且只绘制一次图形,但是使用此代码,程序每秒仅刷新图形 20 次,而计时器正确设置为 16ms (1/60Hz)。

我希望有人可以帮助我提供一些改进代码的线索。 我提前非常感谢你!


Matplotlib 可以生成出版质量的绘图,但不幸的是它不太适合实时绘图和视频。

如果不是严格要求,可以考虑使用pyqtgraph module http://www.pyqtgraph.org/。它与 pyqt5 配合良好,旨在弥补 pyqt5 的缺点matplotlib,特别是在实时区域:

如果您正在做任何需要快速绘图更新、视频或实时交互的事情,matplotlib 并不是最佳选择。 (在我看来)这是 matplotlib 最大的弱点

(from pyqtgraph site)

它还具有附加(可选)功能,例如感兴趣区域、标准化和直方图绘制。

此代码可以在我的笔记本电脑上产生约 160 FPS(禁用直方图):

import sys, random, matplotlib
from PyQt5 import QtCore, QtGui, QtWidgets

import pyqtgraph as pg
import numpy as np


class SecondWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(SecondWindow, self).__init__(parent)
        self.setupUi(self)

    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(800, 600)

        self.im_widget = pg.ImageView(self)
        # uncomment to hide histogram
        # self.im_widget.ui.histogram.hide()

        self.setLayout(QtWidgets.QVBoxLayout())
        self.layout().addWidget(self.im_widget)

        self.initialisationFigure()

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.majFigure)
        self.timer.start(16)

        self.timer2 = QtCore.QTimer(self)
        self.timer2.timeout.connect(self.NumberRefreshPerSecond)
        self.timer2.start(1000)

    def NumberRefreshPerSecond(self):
        print(self.count)
        self.count = 0

    def majFigure(self):
        self.count = self.count + 1
        # numpy random.rand also much faster than list comprehension
        data = np.random.rand(320, 250)
        self.im_widget.setImage(data)

    def initialisationFigure(self):
        self.count = 0
        self.im_widget.show()

    def closeEvent(self, event):
        self.timer.stop()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    form = SecondWindow()
    form.show()
    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matplotlib,使用 imshow 刷新图像更快 的相关文章

随机推荐

  • Java Regex - 从字符串中提取主题标签

    需要从 Java 中的源字符串中提取主题标签字符串 有什么想法 例子吗 谢谢 斯里 这是我正在使用的 它也处理 UTF 8 标签 而不仅仅是 ASCII private static final Pattern TAG PATTERN Pa
  • 机器人代码 + Python

    问题是 如何使用 Python 为 Robocode 制作机器人 似乎有两个选择 Robocode Jython 适用于 NET Iron Python 的 Robocode 第一个有一些信息 但看起来不是很可靠 而后者则没有 一步一步来
  • 构建多种架构的框架(arm64、armv7、armv7s)

    我正在尝试将针对arm64 armv7 和armv7s 的项目构建上传到TestFlight 它正在使用另一个项目的框架 但该框架似乎仅适用于arm64 而不适用于arm64 file was built for arm64 which i
  • Gulp TypeError:path.join 的参数必须是字符串

    我对 gulp ruby sass 有疑问 当我尝试运行时watch任务并更改一些 sass 文件时会出现错误 TypeError Arguments to path join must be strings 这是我的 gulpfile j
  • C++ 中简写“if”的 Python 等效项 [重复]

    这个问题在这里已经有答案了 有没有办法用Python编写这个C C 代码 a b true 123 456 a 123 if b else 456
  • 用于停止事件传播的 jQuery UI 滑块

    我在用jQuery用户界面 http en wikipedia org wiki JQuery UI Slider在可拖动的 div 中 单击滑块后 事件就会传播并且 div 开始拖动 有没有办法在鼠标按下事件时停止其传播 使用 retur
  • Bootstrap 3.0.0 破坏了日期选择器图标

    这里是Demo http plnkr co edit 6nUu7JkVYdTiWHbXhT3f p preview 如果您使用2 3 1 取消第12行的注释 您将看到按钮正确显示 有谁知道如何修复 3 0 0 rc1 版本 要修复 boot
  • 来自 png 图像的橱窗应用程序的表达式混合中的平滑动画

    我想在 Windows 应用商店应用程序的 Expression Blend 中制作动画 因为不支持 gif 图像 所以我有大约 30 张 png 图像 我在 Blend 中制作了一个故事板动画 方法是在时间轴中每 2 秒更改一次图像源 但
  • 为什么 C 数组尾部有多余的字节? [复制]

    这个问题在这里已经有答案了 我检查了 C 数组尾部可能有一些额外的字节 有我的代码 int a 5 int test 1 2 3 4 int b 5 test 1 11 test 4 11 cout lt lt b lt lt endl 1
  • 如何使用 IIS 7.5 压缩 ASP.NET MVC 的 Json 结果

    我很难让 IIS 7 正确压缩 ASP NET MVC 的 Json 结果 我在 IIS 中启用了静态和动态压缩 我可以使用 Fiddler 验证普通文本 html 和类似记录是否已压缩 查看请求 存在接受编码 gzip 标头 响应具有 m
  • Wordpress 登录页面重定向到普通用户的 Woocommerce 我的帐户页面

    我陷入了深深的麻烦之中 请帮我找到以下问题的解决方案 我有一个使用 Woocommerce 插件的 WordPress 网站 通常 Woocommerce 不允许普通用户 客户 用户 您可以从 Wordpress 管理区域 gt 添加新用户
  • 参数返回 SQL0418 的 iDB2 Select 命令

    我正在开发一个使用 IBM Data DB2 iSeries dll 连接到 DB2 iSeries 7 1 数据库的 NET 应用程序 我需要执行一个 SELECT 命令 该命令有 n 个参数 这些参数在查询中定义为 paramX 然后设
  • 将通配符传递给别名

    我使用修改列表命令作为别名 在 KSH 中 alias ltf ls lrt d 1 PWD 所以命令ltf显示类似这样的内容 rw r r 1 myuser mygroup 0 Apr 18 12 00 usr test txt rw r
  • 用C#编写0-1背包的模拟退火算法

    我正在学习模拟退火算法 并且有一些关于如何修改示例算法来解决 0 1 背包问题的问题 我在CP上发现了这段很棒的代码 http www codeproject com KB recipes simulatedAnnealingTSP asp
  • Google Cloud SQL 的典型 ormconfig.json 文件?

    我已经尝试了几个小时了 Google Cloud SQL 与 TypeORM 配合使用的 ormconfig json 文件应该是什么 我设法让它在本地使用数据库的IP 使用mysql工作台和Google云代理并将我的IP列入白名单 但我不
  • 如何等到跟踪脚本触发后再重定向用户?

    我运行一个典型的价格比较网站 用户浏览产品 然后单击链接转到商家的网站 在被重定向到商家的网站之前 用户会看到一个 我们正在重定向您 页面 此页面仅允许跟踪代码 Google Analytics Adwords Bing Ads 来跟踪事件
  • FirebaseRecyclerAdapter 具有用于删除项目的操作模式

    我正在尝试实现一个操作模式来删除 FirebaseRecyclerView 中的项目 奇怪的是 有时删除的项目并不是选定的项目 我认为错误出现在 ToogleSelection 方法或 RemoveItems 方法中 但我不知道它是什么 适
  • PyCharm 在同一文件夹中找不到导入

    我正在使用 PyCharm 并且从同一目录中的另一个 python 文件导入一些常量 导入在运行时起作用 但我在导入语句上以及每次使用文件中的常量时都会得到这个恼人的红色下划线 这是文件层次结构 请忽略文件夹上的红色下划线 它们与此无关 是
  • FileSystemWatcher 网络断开

    我有一个 FileSystemWatcher 监视网络共享上的文件 如果发生导致共享不可用的事件 可能是由于网络问题 FileSystemWatcher 将断开连接 显然我可以处理 错误 事件 也许可以做一些日志记录 并且很多文章建议在错误
  • Matplotlib,使用 imshow 刷新图像更快

    我正在开发一个项目 在该项目上 我必须在 GUI 窗口上绘制 320 250 像素的图像 如果可能的话 每秒绘制 60 次 所以我尝试这样做matplotlib 2 0 2 Python 3 6 and PyQt5 因为我开始了解这些工具并