Python 3.x 计算输出视频流上的fps时出错

Python 3.x 计算输出视频流上的fps时出错,python-3.x,opencv,Python 3.x,Opencv,我已经使用Tensorflow和open cv实现了实时对象检测,如和中所述 目标检测工作得很好,但是我在实现fps计算器时遇到了问题 这是我写的代码: import datetime class FramesPerSecond: def __init__(self): self._startTime = None self._currentTime = None self._total_number_of_frames = 0 def start(self

我已经使用Tensorflow和open 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()

当前_fps返回的值在整个视频流中都会增加,而不是在视频流持续时间内重复保持不变的值

你可以试试这样的。。。虽然我不确定你到底想要这个还是别的什么

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()

当前_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.
希望这有帮助