python 计算fps,两种方式优缺点总结

超链接:深度学习工作常用方法汇总,矩阵维度变化、图片、视频等操作,包含(torch、numpy、opencv等)

——————————————————————————————————————————

看视频进行代码讲解,更容易理解。https://www.bilibili.com/video/BV1HS4y1i7Wh/



import datetime
import os
from tkinter import *
from timeit import time
import cv2
import numpy as np
import yolo_util

import warnings
from tools.parser import get_config


warnings.filterwarnings("ignore", category=DeprecationWarning)



def main_fps():
    '''
    此方式计算的是程序处理这一帧,所用的时间
    当处理实时流时,假如实时流为 25帧/s, 也就是两帧之间的间隔为: 1 / 25 = 0.04s
    当你的处理一帧的速度很快的时候(快于 0.04s),那么你会发现,你每秒处理的帧数是大于原视频的 25帧
    假设处理速度为: 0.02s,那么你的处理速度fps = 1 / 0.02 = 50
    '''

    os.environ["CUDA_VISIBLE_DEVICES"] = '0'
    video_capture = cv2.VideoCapture("D:/project/video_reframe/data/video/test.mp4")

    fps = 0.0
    while True:
        t1 = time.time()
        # 每帧读取
        ret, frame = video_capture.read()
        if ret != True:
            break
        # yolov5,进行预测,替换成自己的处理程序
        bbox, classes, results_xml = yolo_util.predict(frame)
        # 此处的画框操作,也是非常耗时的,尤其是图片越大,耗时越多(可以试试4K,耗时超乎你的想象),
        # 在进行fps测试时,最好将此处注释掉,直接print输出fps
        # 不要画在图片上,直接看
        for box, cla in zip(bbox, classes):
            cv2.rectangle(frame, (box[0][0], box[0][1]), (box[1][0], box[1][1]), (0, 0, 255), 3)
            cv2.putText(frame, str(cla), (box[0][0], box[0][1] - 20), 0, 5e-3 * 150, (0, 0, 255), 2)
        cv2.putText(frame, "FPS: %.1f" % (fps), (int(20), int(40)), 0, 5e-3 * 200, (0, 255, 0), 3)

        image = cv2.resize(frame, None, fx=0.6, fy=0.6)
        cv2.imshow('YOLO5', image)

        fps = int(1 / (time.time() - t1))
        # 在进行fps测试时, 此处cv2.waitKey(1),一定写成1,
        # 0:代表无限等待,等到键盘输入
        # 1000:代表等待1000ms,也就是如果输入1000的话,相当于sleep 了 1s
        key = cv2.waitKey(1) & 0xFF
        if key == 27:
            break



def main_fps_perfect():
    os.environ["CUDA_VISIBLE_DEVICES"] = '0'
    video_capture = cv2.VideoCapture("D:/project/video_reframe/data/video/test.mp4")

    f_count = 0
    t1 = time.time()
    while True:
        # 50 可以修改,最好是改成跟原视频流一样的帧数
        if f_count > 50:
            t1 = time.time()
            f_count = 0
        # 每帧读取
        ret, frame = video_capture.read()
        f_count += 1
        if ret != True:
            break
        # yolov5,进行预测,替换成自己的处理程序
        bbox, classes, results_xml = yolo_util.predict(frame)
        # 此处的画框操作,也是非常耗时的,尤其是图片越大,耗时越多(可以试试4K,耗时超乎你的想象),
        # 在进行fps测试时,最好将此处注释掉,直接print输出fps
        # 不要画在图片上,直接看
        for box, cla in zip(bbox, classes):
            cv2.rectangle(frame, (box[0][0], box[0][1]), (box[1][0], box[1][1]), (0, 0, 255), 3)
            cv2.putText(frame, str(cla), (box[0][0], box[0][1] - 20), 0, 5e-3 * 150, (0, 0, 255), 2)

        fps = int(f_count / (time.time() - t1))
        cv2.putText(frame, "FPS: %.1f" % (fps), (int(20), int(40)), 0, 5e-3 * 200, (0, 255, 0), 3)
        image = cv2.resize(frame, None, fx=0.6, fy=0.6)
        cv2.imshow('YOLO5', image)
        key = cv2.waitKey(1) & 0xFF
        if key == 27:
            break


if __name__ == '__main__':
    os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
    # 有弊端的方式
    # main_fps()
    # 比较完美的方式
    main_fps_perfect()

你可能感兴趣的:(人工智能,python,计算机视觉,深度学习)