Почему мой код замедляется с течением времени? Когда код запускается изначально, выполнение цикла занимает ~0,1 секунды. К 90-му проходу у меня 1+ секунда. Я показываю и сохраняю изображение. Я заметил, что если я закомментирую fig.canvas.draw()
и fig.canvas.flush_events()
код работает как положено. Проблема заключается в отображении и обновлении интерактивного окна. Есть ли переменная, которую мне нужно очистить?
from flirpy.camera.lepton import Lepton
import matplotlib.pyplot as plt
import numpy as np
import cv2
from PIL import Image as im
import os, sys
import time
%matplotlib notebook
savefold = ('Therm')
if not os.path.exists(savefold):
os.makedirs(savefold)
camera = Lepton()
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
def getFrame():
image = camera.grab()
fimage = np.around((image/100 - 273.15) * 9 / 5 + 32, 2)
cimage = np.around(image/100 - 273.15, 2)
kimage = np.around(image/100, 2)
cimage = np.where(cimage < 20, 20, cimage)
cimage = np.where(cimage > 30, 30, cimage)
getFrame.z = cimage
return getFrame.z
getFrame.z = None
i = 0
while True:
tic = time.perf_counter()
npimage=getFrame()
npimage=npimage
data = im.fromarray(npimage)
plt.imshow(data)
fig.canvas.draw()
fig.canvas.flush_events()
plt.imsave(os.path.join(savefold, f'test_{i:05}.png'), data)
i += 1
toc = time.perf_counter()
print(f'Time to execute: {toc - tic:0.4f} seconds')
camera.close()
Потому что вы добавляете одно изображение для каждой итерации: все предыдущие изображения все еще находятся в буфере matplotlib, и они визуализируются!
Вам нужно очистить буфер. Попробуйте использовать эту строку кода перед командой imshow
:
plt.gca().images.clear()