用VisPy中的on_定时器更新scenecavas

2024-05-29 04:55:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个vispy程序,它将显示一个图像并在上面叠加两个圆;最终,这两个圆的信息都将来自实时数据流。在

首先,我试着写一些东西,只会周期性地显示圆圈。我修改了实时信号example from the Vispy gallery,这没问题。因为似乎我想使用scenegraph来将其与图像结合起来,所以我将画布更改为scenecavas。新课程的部分内容在这里;我试图只包含我认为可能相关的内容。在

class Canvas(scene.SceneCanvas):
    def __init__(self, lsl_inlet):
        scene.SceneCanvas.__init__(self, keys='interactive', size=(800, 600))
        ps = self.pixel_scale
        self.unfreeze()
        self.inlet = lsl_inlet

        # Create vertices
        n = 2
        self.data = np.zeros(n, [('a_position', np.float32, 2),
                            ('a_bg_color', np.float32, 4),
                            ('a_fg_color', np.float32, 4),
                            ('a_size', np.float32, 1)])
        self.data['a_fg_color'] = 255, 0, 255, 1
        self.data['a_bg_color'] = 0, 0, 255, 200
        self.data['a_size'] = np.random.uniform(5*ps, 10*ps, n)
        u_linewidth = 1.0
        u_antialias = 1.0

        self.translate = 5
        self.program = gloo.Program(vert, frag)
        self.view = translate((0, 0, -self.translate))

        self.model = np.eye(4, dtype=np.float32)
        self.projection = np.eye(4, dtype=np.float32)

        self.apply_zoom()

        self.program.bind(gloo.VertexBuffer(self.data))
        self.program['u_linewidth'] = u_linewidth
        self.program['u_antialias'] = u_antialias
        self.program['u_model'] = self.model
        self.program['u_view'] = self.view
        self.program['u_size'] = 5 / self.translate

        self.theta = 0
        self.phi = 0

        gloo.set_state('translucent', clear_color='white')

        self.timer = app.Timer(0.5, connect=self.on_timer, start=True)
        self.freeze()
        self.show()

    def read_from_lsl(self):
        sample, time = self.inlet.pull_sample()
        return np.array(sample[:2]), np.array(sample[2:4]), sample[4]

    def on_timer(self, event):
        x, y, diam = self.read_from_lsl()
        self.data['a_position'] = np.array([x,y])
        self.data['a_size'] = diam*np.ones(2)
        self.program.bind(gloo.VertexBuffer(self.data))
        self.program.draw()
        self.update()

我看到的是画布只会非常不规则地更新 并且似乎在一点点之后冻结(但是如果我移动帧,图像可能会更新)。当我使用应用程序画布而不是场景场景。有人看到我做错什么了吗?是风景吗?我注意到很多程序都使用了类似于central的程序_widget.add_视图()但当我尝试为自我程序没用。在

有什么想法吗?在


Tags: samplefrom图像self程序datasizenp

热门问题