Python Timer和TimerFPS计时工具类
作者:小锋学长生活大爆炸 发布时间:2022-06-13 12:48:38
标签:Python,Timer,TimerFPS,计时,工具类
以下工具类代码来自开源项目pyslam
。
Timer
import cv2
class Colors(object):
'''
Colors class:reset all colors with colors.reset; two
sub classes fg for foreground
and bg for background; use as colors.subclass.colorname.
i.e. colors.fg.red or colors.bg.greenalso, the generic bold, disable,
underline, reverse, strike through,
and invisible work with the main class i.e. colors.bold
'''
reset='\033[0m'
bold='\033[01m'
disable='\033[02m'
underline='\033[04m'
reverse='\033[07m'
strikethrough='\033[09m'
invisible='\033[08m'
class fg:
black='\033[30m'
red='\033[31m'
green='\033[32m'
orange='\033[33m'
blue='\033[34m'
purple='\033[35m'
cyan='\033[36m'
lightgrey='\033[37m'
darkgrey='\033[90m'
lightred='\033[91m'
lightgreen='\033[92m'
yellow='\033[93m'
lightblue='\033[94m'
pink='\033[95m'
lightcyan='\033[96m'
class bg:
black='\033[40m'
red='\033[41m'
green='\033[42m'
orange='\033[43m'
blue='\033[44m'
purple='\033[45m'
cyan='\033[46m'
lightgrey='\033[47m'
class Printer(object):
@staticmethod
def red(*args, **kwargs):
print(Colors.fg.red, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def green(*args, **kwargs):
print(Colors.fg.green, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def blue(*args, **kwargs):
print(Colors.fg.blue, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def cyan(*args, **kwargs):
print(Colors.fg.cyan, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def orange(*args, **kwargs):
print(Colors.fg.orange, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def purple(*args, **kwargs):
print(Colors.fg.purple, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def yellow(*args, **kwargs):
print(Colors.fg.yellow, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def error(*args, **kwargs):
print(Colors.fg.red, *args, **kwargs, file=sys.stderr)
print(Colors.reset, end="")
#timer_print = print
timer_print = Printer.cyan
class Timer:
def __init__(self, name = '', is_verbose = False):
self._name = name
self._is_verbose = is_verbose
self._is_paused = False
self._start_time = None
self._accumulated = 0
self._elapsed = 0
self.start()
def start(self):
self._accumulated = 0
self._start_time = cv2.getTickCount()
def pause(self):
now_time = cv2.getTickCount()
self._accumulated += (now_time - self._start_time)/cv2.getTickFrequency()
self._is_paused = True
def resume(self):
if self._is_paused: # considered only if paused
self._start_time = cv2.getTickCount()
self._is_paused = False
def elapsed(self):
if self._is_paused:
self._elapsed = self._accumulated
else:
now = cv2.getTickCount()
self._elapsed = self._accumulated + (now - self._start_time)/cv2.getTickFrequency()
if self._is_verbose is True:
name = self._name
if self._is_paused:
name += ' [paused]'
message = 'Timer::' + name + ' - elapsed: ' + str(self._elapsed)
timer_print(message)
return self._elapsed
用法
import Timer
timer = Timer(is_verbose=True)
timer.start()
# 此处是你的代码
timer.elapsed()
效果
TimerFps
在上面的基础上,再加上下面代码段:
import os
import numpy as np
import cv2
import math
class MovingAverage:
def __init__(self, average_width = 10, compute_sigma = False):
self._average_width = average_width
self._idx_ring = 0
self._average = 0
self._sigma2 = 0
self._is_init = False
self._is_compute_sigma = compute_sigma
self._one_over_average_width_min_one = 1./(average_width-1)
self._ring_buffer = np.zeros(average_width)
def init(self, initVal=None):
if initVal is None:
initVal = 0.
self._ring_buffer = np.full(self._average_width, initVal, dtype=np.float32)
self._average = initVal;
self._sigma2 = 0;
self._is_init = True;
def getAverage(self, new_val=None):
if not self._is_init:
self.init(new_val)
if new_val is None:
return self._average
averageOld = self._average
oldVal = self._ring_buffer[self._idx_ring]
self._average += (new_val - oldVal)/self._average_width
if self._is_compute_sigma:
self._sigma2 = self._sigma2 + self._one_over_average_width_min_one*(self._average_width*(averageOld*averageOld - self._average*self._average) - oldVal*oldVal + newVal*newVal)
self._ring_buffer[self._idx_ring] = new_val
self._idx_ring = (self._idx_ring + 1) % self._average_width
return self._average
def getSigma(self):
return math.sqrt(max(self._sigma2,0.))
class TimerFps(Timer):
def __init__(self, name='', average_width = 10, is_verbose = True):
super().__init__(name, is_verbose)
self.moving_average = MovingAverage(average_width)
def refresh(self):
elapsed = self.elapsed()
self.moving_average.getAverage(elapsed)
self.start()
if self._is_verbose is True:
dT = self.moving_average.getAverage()
name = self._name
if self._is_paused:
name += ' [paused]'
message = 'Timer::' + name + ' - fps: ' + str(1./dT) + ', T: ' + str(dT)
timer_print(message)
用法
import TimerFps
timer = TimerFps(name='')
timer.start()
# 这里是你的代码
timer.refresh()
效果
来源:https://xfxuezhang.blog.csdn.net/article/details/122407412


猜你喜欢
- 装饰器装饰器的定义关于装饰器的定义,我们先来看一段github上大佬的定义:Function decorators are simply w
- 创建一个表T_Employee并插入若干数据 代码如下:create table T_Employee(FNumber VARC
- 终于找到bug原因!记一下;还是不熟悉平台的原因造成的! Q:为什么会出现两个模型对象在同一个文件中一起运行,当直接读取他们分开运行时训练出
- PPT链接说实话,看到这个题目时我觉得这有什么好讨论的,肯定会是场一边倒的讨论。因为个人比较倾向于短命名,简单优雅,可能是出于程序员的洁癖,
- 1.说明opencv安装包中有训练好的分类器文件,可以实现人脸的识别。当然,我们也可以训练自己的分类器文件,实现对特定物体的识别。本文章就详
- 本文实例为大家分享了Python求多幅图像栅格值的平均值,供大家参考,具体内容如下本程序所采用的方法并不是最优方法,ARCGIS已经提供了相
- <?php/*======================================事务处理==================
- 使用原生SQL语句进行对数据库操作,可完成数据库表的建立和删除,及数据表内容的增删改查操作等。其可操作性很强,如可以直接使用“show da
- 最近各地中小学都在开展线上教学,有些不自觉的小朋友们用电脑在线学习的时候会趁家长不在的时候偷偷玩游戏、看漫画。本程序screenshot.p
- keras.utils.to_categorical这个方法,源码中,它是这样写的:Converts a class vector (int
- 前言在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和
- “深入认识Python内建类型”这部分的内容会从源码角度为大家介绍Python中各种常用的内建类型。
- 这几天正在追剧,原名《大秦帝国之天下》的《大秦赋》,看着看着又想把前几部刷一遍了,但第一部《裂变》自己没有高清资源,搜了一波发现yout
- asp按关键字查询XML的问题 '-------------------------------------------------
- 引包引入对应的包,和原来一样写一个打印文字的方法import sys, random, pygamefrom pygame.lo
- 你可能在使用MySQL过程中,各种意外导致数据库表的损坏,而且这些数据往往是最新的数据,通常不可能在备份数据中找到。本章将讲述如何检测MyS
- 1、Windows上anaconda安装配置mmdetection环境稍后再写2、将anaconda环境离线移植到另一台电脑首先将anaco
- 锟拷码和口字码说到乱码问题就不得不提到锟斤拷,这算是非常常见的一种乱码形式,那么它到底是经过何种错误操作产生的呢?下面我们一步步探究。看一个
- 前言所谓“基础不狠,人站不稳”,对于任何一种编程语言来说基础往往都是重中之重,以Python为例,其
- 网络编程有三个要素,分别是IP地址、端口号和通信协议,那本文主要讲述的是TCP与UDP这两种通信协议,以及编程的实现。首先,我们需要了解一下