After having left the app to run for a couple of hours, I noticed that the memory had more than doubled.
From 70MB to 150MB of "Real Memory" as Mac's Activity Monitor puts it.
What was happening is that I had created a list that was growing with each frame in order to calculate the average of the frames.
I decided to get rid of this, first creating a circular counter in Python using a generator that resets to 0 when reaches a max value. Then initiating a fixed-size list that the generator will fill the fps in a circular manner.
It looks like this:
def circular_counter(max):
"""helper function that creates an eternal counter till a max value"""
x = 0
while True:
if x == max:
x = 0
x += 1
yield x
class CvTimer(object):
def __init__(self):
self.tick_frequency = cv2.getTickFrequency()
self.tick_at_init = cv2.getTickCount()
self.last_tick = self.tick_at_init
self.fps_len = 100
self.l_fps_history = [ 10 for x in range(self.fps_len)]
self.fps_counter = circular_counter(self.fps_len)
def reset(self):
self.last_tick = cv2.getTickCount()
def get_tick_now(self):
return cv2.getTickCount()
@property
def fps(self):
fps = self.tick_frequency / (self.get_tick_now() - self.last_tick)
self.l_fps_history[self.fps_counter.next() - 1] = fps
return fps
@property
def avg_fps(self):
return sum(self.l_fps_history) / float(self.fps_len)
In your frame-by-frame while loop:
#Timecv:
cv2.putText(self.a_frame, "fps=%s avg=%s" % (timer.fps, timer.avg_fps),
(10, 75), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255))
And finally in the app window: