我已经使用Tensorflow实现了实时对象检测,并按照this post和this GitHub repo中所述打开了cv。
对象检测效果很好,但是我无法实现fps计算器。
这是我编写的代码:
import datetime
class FramesPerSecond:
def __init__(self):
self._startTime = None
self._currentTime = None
self._total_number_of_frames = 0
def start(self):
# start timer
self._startTime = datetime.datetime.now()
return self
def stop(self):
# stop times
self._currentTime = datetime.datetime.now()
def update_frames(self):
self._total_number_of_frames = self._total_number_of_frames + 1
def elapsed_time(self):
return (datetime.datetime.now() - self._startTime).total_seconds()
def current_fps(self):
return self._total_number_of_frames / self.elapsed_time()
current_fps会返回一个在整个流中增加的值,而不是重现在视频流的持续时间内保持不变的值。
答案 0 :(得分:0)
您可以尝试类似的方法...尽管我不确定您是否确实想要这样或其他方法...
import datetime
class FPS:
def __init__(self):
...
...
self._elapsed = 0
self._fps = 0
def start(self, ttl):
self._startTime = datetime.datetime.now()
self._currentTime = datetime.datetime.now() + datetime.timedelta(seconds=ttl)
# print('counter started at --> ', self._startTime)
# print('counter stopped at --> ', self._currentTime)
return self._startTime, self._currentTime
def elapsed_time(self):
self._elapsed = (self._currentTime - self._startTime).total_seconds()
return self._elapsed
def update_frames(self):
curr, start = self._currentTime, self._startTime
if curr != start and curr != 0:
print('updatin frames ...')
for i in range(int(self._elapsed) + 1):
self._total_number_of_frames += i
else:
self._total_number_of_frames += 1
self.current_fps()
print("frames: {}, fps: {}, time spent: {}".format(
self._total_number_of_frames,
self._fps,
self._elapsed
))
def current_fps(self):
self._fps = self._total_number_of_frames / self._elapsed
return self._fps
if __name__ == '__main__':
fps = FPS()
ttl = int(input('time-to-live in seconds: '))
fps.start(ttl)
fps.elapsed_time()
fps.update_frames()
答案 1 :(得分:0)
current_fps函数返回一个随时间增加的值,因为self._total_number_of_frames属性将继续增加,而经过的时间将在循环的每次迭代中或多或少保持恒定。基本上,分子将永远增加,而分母将保持在一定范围内,从而导致该值随时间增加。
为避免此问题,我们必须允许经过的时间函数随着增加的帧而扩大,或者使用其他常数来衡量fps。让我们与后者一起使用,并保留一个单独的计数器变量。
因此,您的上述代码可以这样重写:
import time # The time module is easier for our purpose.
class FramesPerSecond:
def __init__(self):
self.startTime = None
self.total_number_of_frames = 0
self.counter = 0
self.frameRate = 1 # The number of seconds to wait for each measurement.
def start(self):
self.startTime = time.time() # Returns a UNIX timestamp.
def update_frames(self):
self.total_number_of_frames += 1
def elapsed_time(self):
return time.time() - self.startTime
def current_fps(self):
return self.counter / self.elapsed_time() # We are measuring against the counter instead of no. of frames.
fps = FramesPerSecond()
fps.start()
while True: # Your main loop.
# Rest of your code here #
fps.update_frames()
fps.counter += 1 # Count will increase until the if condition executes.
if fps.elapsed_time() > fps.frameRate: # We measure the fps only after 1 second has passed.
print("FPS: ", fps.current_fps()) # The frames per second.
fps.counter = 0 # reset the counter for next iteration.
fps.start() # reset the start time.
希望这会有所帮助!