Я пытаюсь написать программу Vispy, которая будет отображать изображение и накладывать два круга сверху;в конечном счете, информация для них будет поступать из потоков данных в реальном времени.
Для начала я пытаюсь написать что-то, что будет периодически отображать круги.Я изменил пример сигнала реального времени из галереи Vispy , и это сработало нормально. Поскольку мне кажется, что я хочу использовать графы сцены, чтобы объединить это с изображением, я изменил Canvas на sceneCanvas.Части нового класса здесь;Я попытался включить только то, что, по моему мнению, может быть уместным.
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()
Я вижу, что холст будет обновляться очень нерегулярно и, кажется, через некоторое время зависнет (но изображение можетобновить, если я переместить кадр).Это работало нормально, когда я использовал app.Canvas вместо SceneCanvas.Кто-нибудь видит, что я могу делать не так?Это вид?Я заметил, что многие программы использовали что-то вроде central_widget.add_view (), но когда я попробовал это, настройка 'u_view' для self.program не сработала.
Есть идеи?