【python】OpenCV—Faster Video File FPS

news/2024/9/25 6:01:20/

在这里插入图片描述

文章目录

  • 1、需求描述
  • 2、正常方法 cv2.read
  • 3、加速方法 imutils.video.FileVideoStream
  • 4、涉及到的核心库函数
    • 4.1、imutils.video.FPS
    • 4.2、imutils.video.FileVideoStream
  • 5、参考

1、需求描述

使用线程和队列数据结构将视频文件的 FPS 速率提高 !

我们的目标是将视频文件帧的读取和解码移动到程序的一个完全独立的线程中,释放我们的主线程来处理实际的图像处理。

2、正常方法 cv2.read

python">import datetime# class FPS:
# 	def __init__(self):
# 		# 存储开始时间、结束时间和在开始和结束间隔之间检查的帧总数
# 		self._start = None
# 		self._end = None
# 		self._numFrames = 0
#
# 	def start(self):
# 		# 开始计时器
# 		self._start = datetime.datetime.now()
# 		return self
#
# 	def stop(self):
# 		# 停止计时器
# 		self._end = datetime.datetime.now()
#
# 	def update(self):
# 		# 增加在开始和结束间隔期间检查的总帧数
# 		self._numFrames += 1
#
# 	def elapsed(self):
# 		# 返回开始和结束间隔之间的总秒数
# 		return (self._end - self._start).total_seconds()
#
# 	def fps(self):
# 		# 计算每秒(近似)帧数
# 		return self._numFrames / self.elapsed()# import the necessary packages
from imutils.video import FPS
import numpy as np
import argparse
import imutils
import cv2
# 构造参数解析器并解析参数
ap = argparse.ArgumentParser()
# 解析我们的命令行参数。对于这个脚本,我们只需要一个开关 --video ,它是我们输入视频文件的路径。
ap.add_argument("-v", "--video", default="1.mp4",help="path to input video file")
args = vars(ap.parse_args())
# 打开一个指向视频流的指针,并启动FPS定时器
stream = cv2.VideoCapture(args["video"])
fps = FPS().start()  # 启动一个我们可以用来测量 FPS 的计时器# 循环视频文件流中的帧
while True:# 从线程视频文件流中抓取帧(grabbed, frame) = stream.read()# 如果帧没有被抓取,那么我们已经到达了流的末尾if not grabbed:break# 调整帧大小并将其转换为灰度(同时仍保留 3 个通道)frame = imutils.resize(frame, width=450)frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)frame = np.dstack([frame, frame, frame])# 在图像中显示一段文本(这样我们就可以公平地对快速方法进行基准测试)cv2.putText(frame, "Slow Method", (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)# 显示帧并更新 FPS 计数器cv2.imshow("Frame", frame)cv2.waitKey(1)fps.update()# 停止定时器,显示FPS信息
fps.stop()
print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
# 做一些清理工作
stream.release()
cv2.destroyAllWindows()

output

python">[INFO] elasped time: 13.08
[INFO] approx. FPS: 29.27

在这里插入图片描述

3、加速方法 imutils.video.FileVideoStream

python"># 导入必要的包
from imutils.video import FileVideoStream
from imutils.video import FPS
import numpy as np
import argparse
import imutils
import time
import cv2# 构造参数解析并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", default="1.mp4",help="path to input video file")
args = vars(ap.parse_args())
# 启动文件视频流线程并允许缓冲区开始填充
print("[INFO] starting video file thread...")
fvs = FileVideoStream(args["video"]).start()
time.sleep(1.0)
# 启动 FPS 计时器
fps = FPS().start()# 循环播放视频文件流中的帧
while fvs.more():# 从线程视频文件流中抓取帧,调整大小,并将其转换为灰度(同时仍保留 3 个通道)frame = fvs.read()try:frame = imutils.resize(frame, width=450)except:breakframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)frame = np.dstack([frame, frame, frame])# 在frame上显示队列的大小cv2.putText(frame, "Queue Size: {}".format(fvs.Q.qsize()),(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)# 显示帧并更新 FPS 计数器cv2.imshow("Frame", frame)cv2.waitKey(1)fps.update()# 停止计时器并显示 FPS 信息
fps.stop()
print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
# 做一些清理工作
cv2.destroyAllWindows()
fvs.stop()

output

python">[INFO] starting video file thread...
[INFO] elasped time: 8.87
[INFO] approx. FPS: 43.19

在这里插入图片描述

帧率从30-提升到了40+

确实有效

4、涉及到的核心库函数

4.1、imutils.video.FPS

python">import datetimeclass FPS:def __init__(self):# 存储开始时间、结束时间和在开始和结束间隔之间检查的帧总数self._start = Noneself._end = Noneself._numFrames = 0def start(self):# 开始计时器self._start = datetime.datetime.now()return selfdef stop(self):# 停止计时器self._end = datetime.datetime.now()def update(self):# 增加在开始和结束间隔期间检查的总帧数self._numFrames += 1def elapsed(self):# 返回开始和结束间隔之间的总秒数return (self._end - self._start).total_seconds()def fps(self):# 计算每秒(近似)帧数return self._numFrames / self.elapsed()

4.2、imutils.video.FileVideoStream

python"># import the necessary packages
from threading import Thread
import sys
import cv2# 从 Python 3 导入 Queue 类
if sys.version_info >= (3, 0):from queue import Queue
# 否则,为 Python 2.7 导入 Queue 类
else:from Queue import Queueclass FileVideoStream:def __init__(self, path, queueSize=128):# 初始化文件视频流以及用于指示线程是否应该停止的布尔值self.stream = cv2.VideoCapture(path)self.stopped = False# 初始化存储视频文件帧的队列self.Q = Queue(maxsize=queueSize)def start(self):# 启动一个线程从文件视频流中读取帧t = Thread(target=self.update, args=())t.daemon = Truet.start()return selfdef update(self):# 循环while True:# 如果设置了线程指示器变量,则停止线程if self.stopped:return# 否则,请确保队列中有空间if not self.Q.full():# 从文件中读取下一帧(grabbed, frame) = self.stream.read()# 如果 grabbed 布尔值为 False,那么我们已经到了视频文件的末尾if not grabbed:self.stop()return# 将帧添加到队列中self.Q.put(frame)def read(self):# 返回队列中的下一帧return self.Q.get()def more(self):# 如果队列中还有帧,则返回 Truereturn self.Q.qsize() > 0def stop(self):# 指示应该停止线程self.stopped = True

5、参考

参考学习来自:

  • 基于cv2.VideoCapture 和 OpenCV 得到更快的 FPS之文件篇

  • 基于cv2.VideoCapture 和 OpenCV 得到更快的 FPS之Webcam篇


http://www.ppmy.cn/news/1502143.html

相关文章

Meta Llama 3.1:AI领域的新里程碑

Meta最近推出了其最新的AI模型Llama 3.1,这不仅是一个技术上的飞跃,更是AI领域的一次重大突破。以下是Llama 3.1的一些关键技术亮点,值得每一位AI爱好者和开发者关注。 参数规模与性能 Llama 3.1包含三种规格:8B(80亿…

Linux并发程序设计(5):线程基础

目录 一、介绍 1.1 线程与进程的区别 1.2 线程特点 1.3 线程共享资源 1.4 线程私有资源 1.5 Linux线程库 二、相关函数 2.1 线程创建 – pthread_create 2.2 线程结束 – pthread_exit 2.3 线程查看tid函数 2.4 线程回收 2.4.1 使用pyhread_join进行线程回收 2.4.…

前端怎么本地起一个服务查看本地文件

1.安装拓展 安装 Live Server拓展 2.创建一个html文件 3.在html文件中右键选择 Open with Live Server 4.浏览器打开运行的地址,并去除路径,例如:http://127.0.0.1:5500/

20240725java的Controller、DAO、DO、Mapper、Service层、反射、AOP注解等内容的学习

在Java开发中,‌controller、‌dao、‌do、‌mapper等概念通常与MVC(‌Model-View-Controller)‌架构和分层设计相关。‌这些概念各自承担着不同的职责,‌共同协作以构建和运行一个应用程序。‌以下是这些概念的解释:‌…

Linux网络工具“瑞士军刀“集合

一、背景 平常我们在进行Linux服务器相关运维的时候,总会遇到一些网络相关的问题。我们可以借助这些小巧、功能强悍的工具帮助我们排查问题、解决问题。 下面结合之前的一些使用经验为大家介绍一下一些经典应用场景下,这个网络命令工具如何使用的。例如怎…

【OceanBase DBA早下班系列】—— obdiag 收集的 SQL Monitor Report 如何解读

1. 前言 前几天写了一篇博客,告诉大家在遇到慢SQL或者复杂的并行SQL的时候怎么高效的来收集【SQL Monitor Report】,上一篇博客的链接: OceanBase 社区 ;发出去后有不少问我这份报告咋解读。今天再出一篇博客给大家介绍下如何解…

FPGA开发——D触发器的设计

1、概述 锁存器和触发器有时组合在一起,因为它们都可以在其输出上存储一位(1或0)。与锁存器相比,触发器是需要时钟信号(Clk)的同步电路。D 触发器仅在时钟从0 到 1(上升沿)或 1 到 …

LitCTF2024赛后web复现

复现要求:看wp做一遍,自己做一遍,第二天再做一遍。(一眼看出来就跳过) 目录 [LitCTF 2024]浏览器也能套娃? [LitCTF 2024]一个....池子? [LitCTF 2024]高亮主题(划掉)背景查看器 [LitCTF 2…