【python】OpenCV—Faster Video File FPS

news2024/11/27 21:03:23

在这里插入图片描述

文章目录

  • 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

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

[INFO] elasped time: 13.08
[INFO] approx. FPS: 29.27

在这里插入图片描述

3、加速方法 imutils.video.FileVideoStream

# 导入必要的包
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:
        break
    frame = 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

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

在这里插入图片描述

帧率从30-提升到了40+

确实有效

4、涉及到的核心库函数

4.1、imutils.video.FPS

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

4.2、imutils.video.FileVideoStream

# 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 Queue

class 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 = True
        t.start()
        return self
    def 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):
        # 如果队列中还有帧,则返回 True
        return self.Q.qsize() > 0
    def stop(self):
        # 指示应该停止线程
        self.stopped = True

5、参考

参考学习来自:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Qt3D程序场景中无法显示创建的立体图形?

有的新手在创建Qt3D程序时,因为不熟练,导致经常遇到无法显示3D图形的情况。 原因其实也简单,就是设置的摄像机的位置不对,或者压根没有设置摄像机。 // CameraQt3DRender::QCamera *cameraEntity view.camera();cameraEntity-&g…

文件未保存后能否恢复?分享实用恢复指南,6个方法

在日常用电脑时文件未保存而导致的数据丢失,是许多人都会遭遇的棘手问题。那么面对这样的情况,文件真的能够恢复吗?本文将深入分析文件恢复的可能性,并提供一系列实用的建议。 一、了解文件恢复的基础 首先我们需要明白文件恢复并…

每一次新建终端固定到某个环境,配置PyCharm终端以自动激活环境

在PyCharm中,即使已经为项目设置了特定的Python解释器,默认情况下,新建的终端可能不会自动激活与项目绑定的Conda虚拟环境。要解决这个问题,可以采取以下步骤: 1. 配置PyCharm终端以自动激活环境 PyCharm支持为每个项…

手把手教你用家用电脑完成图片和视频AI去水印功能

一.效果展示 二.video-subtitle-remover源码地址 soda151314/video-subtitle-remover: 基于AI的图片/视频硬字幕去除、文本水印去除,无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API,本地实现。AI-based tool for removing hard-cod…

孟德尔随机化、R语言,报错,如何解决?

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

推荐一款前端滑动验证码插件(Vue、uniapp)

uniapp版本&#xff1a;滑块拼图验证码&#xff0c;有后端&#xff0c;简单几步即可实现&#xff0c;小程序、h5都可以用 - DCloud 插件市场 Vue版本及cdn版本可以查阅文档&#xff1a; 行为验证 | Poster 文档 示例代码&#xff1a; <template><view id"app&…

使用阿里云的PAI-DSW进行语音关键词的训练

以前使用谷歌的Colab进行过在线的模型训练&#xff0c;不过要科学上网总是比较麻烦&#xff0c;今天第一次尝试使用阿里云的人工智能平台PAI/交互式建模&#xff08;DSW&#xff09;进行在线训练。 我采用的训练笔记本是TensorFlow的Simple audio recognition: Recognizing ke…

贝锐蒲公英视频监控方案:无需专线,实现连锁酒店摄像头集中监看

公司业务主要围绕连锁品牌酒店经营&#xff0c;从2019年成立至今&#xff0c;已经在北京、上海、杭州、武汉、南京、深圳等地设立了多家门店。为了实现集中管理&#xff0c;北京总部需要实时监看或调取各地酒店内的监控摄像头&#xff0c;并将监控数据集中存储至监控中心的服务…

智云-一个抓取web流量的轻量级蜜罐

智云-一个抓取web流量的轻量级蜜罐 安装环境要求 apache php7.4 mysql8 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN 系统演示

【康复学习--LeetCode每日一题】3111. 覆盖所有点的最少矩形数目

题目&#xff1a; 给你一个二维整数数组 point &#xff0c;其中 points[i] [xi, yi] 表示二维平面内的一个点。同时给你一个整数 w 。你需要用矩形 覆盖所有 点。 每个矩形的左下角在某个点 (x1, 0) 处&#xff0c;且右上角在某个点 (x2, y2) 处&#xff0c;其中 x1 < x…

Base64解码时Illegal base64 character 20问题解决

一&#xff0c;问题 在使用Base64解码的时候 // 这里的keyContent是公钥&#xff0c;一般配置到配置中心里&#xff0c;然后注入到容器里 String publicKeyString keyContent .replaceAll("\\n", "") .replace("-----BEGIN PUBLIC KEY-----",…

二进制搭建 Kubernetes v1.20(中)

一、部署 CNI 网络组件 目录 一、部署 CNI 网络组件 1.flannel简介 1&#xff09;UDP模式 2&#xff09;VXLAN 模式 2.部署flannel ​编辑 3.Calico简介 1.flannel简介 K8S 中 Pod 网络通信&#xff1a;●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff0…

什么是网络安全等级保护测评服务?

等保测评 依据国家网络安全等级保护制度规定&#xff0c;按照有关管理规范和技术标准&#xff0c;对非涉及国家秘密的网络安全等级保护状况进行检测评估。定级协助 根据等级保护对象在国家安全、经济建设、社会生活中的重要程度&#xff0c;以及一旦遭到破坏、丧失功能或者数据…

【Python工具】Python 实现 telnet、loguru 框架下的 DEBUG 分级日志打印

文章目录 1、背景2、轮子2.1、telnet2.2、loguru DEBUG 日志分级 1、背景 最近业务这边需要用 Python 起一个 web 服务器&#xff0c;做 LLM 相关的业务处理。后台选用的是 django 框架做 web 框架&#xff0c;现在也算结项了。初次写 Python&#xff0c;造出来的轮子啥的总结…

FPGA知识基础之--按键控制LED灯项目

文章目录 前言一、按键简介按键:通过按下或者释放来控制电路通断的电子元件按键原理图 二、实验要求三、程序设计3.1思路整理3.2 模型搭建3.3 顶层模块3.4 波形分析 四、代码整理4.1RTL代码4.2 仿真只需在Testbench上增加上述一段代码即可将参数实例化,可达到在Testbench上更改…

随堂测小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;试题信息管理&#xff0c;标签类型管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;考试成绩&#xff0c;试题信息&#xff0…

RDP Microsoft Remote Desktop 优化指南

RDP优化指南 RDP的优化主要从以下几个方面进行&#xff1a; 帧率设置开启硬件加速&#xff08;使用显卡&#xff09;传输协议设置链接用户数量nVidia显卡加速 1. 帧率设置&#xff08;这里我建议可以不去更改&#xff09; 我更信任UFO Test的FPS值&#xff0c;有人说改完之后…

15.2 zookeeper java client

15.2 zookeeper java client 1. Zookeeper官方1.1 依赖1.2 Zookeeper客户端连接测试1.3 Zookeeper节点操作1.3.1 zooKeeper.create创建节点1.3.2 zooKeeper.exists获取节点详情1.3.3 zooKeeper.getData获取节点数据1.3.4 zooKeeper.getChildren获取节点下所有子节点名称1.3.5 …

网络地址转换(NAT)

文章目录 NAT的作用NAT的实现方式NAT静态转换工作过程 NAT的作用 局域网与互联网的通信需求 重叠网段合并互通 隐藏内部网络的细节 NAT的实现方式 静态转换 "一对一"固定转换 动态转换 Basic NAT "一对一”动态转换。需要创建公网地址池 eNAPT 通过“IP地址端口…

c#调用python代码,实现读取npy的数据并显示图像

本例子实现的功能是&#xff1a; 根据stat.npy、ops.npy两个npy文件的内容&#xff0c;显示图形 1. 用python代码实现读取两个文件&#xff0c;文件名为read_npy.py&#xff0c;代码如下&#xff1a; import numpy as npdef read_npy_files(stat_file, ops_file):stat np.lo…