当前位置: 首页 > news >正文

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果

一、简单介绍

二、简单指定视频某片段重复播放效果实现原理

三、简单指定视频某片段重复播放效果案例实现简单步骤

四、注意事项


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、简单指定视频某片段重复播放效果实现原理

要在 Python 中使用 OpenCV 指定视频某段连续帧,然后重复播放若干次。当指定的起始帧和结束帧超出视频的有效范围时,我们需要进行安全校验,以防止越界访问。

并将重复的视频片段插入原始视频中,分别处理重复片段之前和之后的部分,然后再将它们组合起来。

实现原理:

  1. 读取原始视频文件。
  2. 分别处理重复片段之前、重复片段和重复片段之后的部分。
  3. 将这些部分按顺序合并成新的视频。

具体方法:

  1. 使用 OpenCV 中的 cv2.VideoCapture() 函数读取原始视频文件。
  2. 获取原始视频的帧率、总帧数和尺寸等信息。
  3. 对指定的重复片段之前、重复片段和重复片段之后的部分进行逐帧处理。
  4. 利用 cv2.VideoWriter() 创建输出视频文件对象,并按照顺序将处理好的视频帧写入其中。

实现中涉及了以下关键函数:

  1. cv2.VideoCapture():用于从视频文件中读取视频帧的函数。它创建了一个视频捕获对象,可以用来逐帧读取视频内容。

  2. cv2.VideoWriter():用于创建视频写入对象的函数。它创建了一个视频写入对象,可以用来将视频帧写入到输出视频文件中。

  3. cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index):用于设置视频文件读取的起始帧。这个函数可以将视频文件的读取位置设置为指定的帧序号。

  4. cap.get(cv2.CAP_PROP_FPS):用于获取视频帧率的函数。它返回视频文件中的帧率信息,以便在创建输出视频对象时保持一致。

  5. cap.get(cv2.CAP_PROP_FRAME_COUNT):用于获取视频总帧数的函数。它返回视频文件中的总帧数信息,以便在处理视频片段时进行判断。

  6. cap.read():用于逐帧读取视频内容的函数。它返回一个布尔值和一个视频帧,布尔值表示是否成功读取了视频帧,视频帧则是一个 NumPy 数组,表示当前读取的视频帧内容。

  7. out.write(frame):用于将视频帧写入输出视频文件的函数。它将指定的视频帧写入到输出视频对象中。

  8. cap.release()out.release():分别用于释放视频捕获对象和视频写入对象的函数。它们释放了底层的资源,确保在程序结束时资源得到正确释放。

通过这些关键函数的组合和调用,实现了从原始视频中提取指定片段、重复播放指定次数,并生成新的视频文件的功能。

三、简单指定视频某片段重复播放效果案例实现简单步骤

1、编写代码

2、运行效果

3、具体代码

"""
简单指定视频某片段重复播放效果1、使用 OpenCV 中的 cv2.VideoCapture() 函数读取原始视频文件。2、获取原始视频的帧率、总帧数和尺寸等信息。3、对指定的重复片段之前、重复片段和重复片段之后的部分进行逐帧处理。4、利用 cv2.VideoWriter() 创建输出视频文件对象,并按照顺序将处理好的视频帧写入其中。
"""import cv2def repeat_video_segment(input_video_path, output_video_path, start_frame, end_frame, repeat_count):"""指定视频片段重复若干次:param input_video_path::param output_video_path::param start_frame::param end_frame::param repeat_count::return:"""# 读取原始视频文件cap = cv2.VideoCapture(input_video_path)# 获取原始视频的帧率和总帧数fps = cap.get(cv2.CAP_PROP_FPS)total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))# 校验起始帧和结束帧是否有效if start_frame < 0 or end_frame < 0 or start_frame >= total_frames or end_frame >= total_frames:print("Error: Invalid start or end frame.")return# 获取原始视频的宽度和高度width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 定义视频编码器fourcc = cv2.VideoWriter_fourcc(*'mp4v')# 创建输出视频文件对象out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))# 设置视频文件读取的起始帧cap.set(cv2.CAP_PROP_POS_FRAMES, 0)# 写入重复片段之前的部分for frame_index in range(start_frame):ret, frame = cap.read()if ret:out.write(frame)else:break# 写入重复片段for _ in range(repeat_count):# 设置视频文件读取的起始帧为重复片段的起始帧cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame)# 逐帧读取重复片段并写入输出视频对象for frame_index in range(start_frame, end_frame + 1):ret, frame = cap.read()if ret:out.write(frame)else:break# 写入重复片段之后的部分for frame_index in range(end_frame + 1, total_frames):cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index)ret, frame = cap.read()if ret:out.write(frame)else:break# 释放资源cap.release()out.release()cv2.destroyAllWindows()def main():# 调用函数并指定输入和输出视频文件路径,以及要重复播放的视频段的起始帧和结束帧,以及重复播放的次数input_video_path = "Videos/CatRun.mp4"output_video_path = "Videos/VideoRepeatSegment.mp4"start_frame = 130  # 重复片段的起始帧end_frame = 200  # 重复片段的结束帧repeat_count = 3  # 重复播放的次数repeat_video_segment(input_video_path, output_video_path, start_frame, end_frame, repeat_count)if __name__ == "__main__":main()

四、注意事项

  1. 校验起始帧和结束帧是否有效,确保不会越界。
  2. 在处理视频片段之前和之后,需要设置视频文件读取的起始帧。
  3. 在循环读取视频帧时,需要判断视频文件是否读取到了末尾。
  4. 最后需要释放资源,包括释放视频文件对象和关闭所有窗口。

相关文章:

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果 一、简单介绍 二、简单指定视频某片段重复播放…...

ARXML处理 - C#的解析代码(二)

参数类 参数容器&#xff08;ECUCPARAMCONFCONTAINERDEF&#xff09;的PARAMETERS集合类由以下参数类实例构成。 枚举参数&#xff08;ECUCENUMERATIONPARAMDEF &#xff09; 配置一个下拉选项&#xff0c;如PORT中一个pin可以配置SPI, CAN, PWM /// <remarks/>[Syste…...

关于华为即将举行的鸿蒙春季沟通会的新闻报道

华为计划在4月11日举办此次活动&#xff0c;届时将推出与车和PC类相关的新产品。尽管备受期待的华为P70系列设备的发布尚未得到官方确认&#xff0c;但已有多家媒体对此进行了报道。 文章中还提到了智界S7的新款可能在4月11日上市&#xff0c;并进行多项新功能升级。智界S7是去…...

MySQL视图及如何导入导出

1.视图 MySQL 视图&#xff08;View&#xff09;是一种虚拟存在的表&#xff0c;同真实表一样&#xff0c;视图也由列和行构成&#xff0c;但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表&#xff0c;并且还是在使用视图时动态生成的&#xff0…...

文心一言上线声音定制功能;通义千问开源模型;openAI又侵权?

文心一言上线定制专属声音功能 百度旗下 AI 聊天机器人文心一言上线新功能&#xff0c;用户录音一句话&#xff0c;即可定制声音。 使用这项功能需要使用文心一言 App。在创建智能体中&#xff0c;点击创建自己的声音&#xff0c;朗读系统提示的一句话&#xff0c;等候几秒钟时…...

课时89:流程控制_函数进阶_函数变量

2.1.4 综合案例 这一节&#xff0c;我们从 信息采集、环境部署、小结 三个方面来学习。 信息采集 脚本实践-采集系统负载信息 查看脚本内容 [rootlocalhost ~]# cat function_systemctl_load.sh #!/bin/bash # 功能&#xff1a;采集系统负载信息 # 版本&#xff1a;v0.3 # …...

Linux命令-dpkg-preconfigure命令(Debian Linux中软件包安装之前询问问题)

说明 dpkg-preconfigure命令 用于在Debian Linux中软件包安装之前询问问题。 语法 dpkg-preconfigure(选项)(参数)选项 -f&#xff1a;选择使用的前端&#xff1b; -p&#xff1a;感兴趣的最低的优先级问题&#xff1b; --apt&#xff1a;在apt模式下运行。参数 软件包&am…...

SEO优化艺术:精细化技巧揭示与搜索引擎推广全面战略解读

SEO&#xff08;搜索引擎优化&#xff0c;Search Engine Optimization&#xff09;是一种网络营销策略&#xff0c;旨在通过改进网站内外的各项元素&#xff0c;提升网站在搜索引擎自然搜索结果中的排名&#xff0c;从而吸引更多目标用户访问网站&#xff0c;增加流量&#xff…...

《springcloud alibaba》 四 seata安装以及使用

目录 准备调整db配置准备创建数据库 seata配置nacos配置confi.txt下载向nacos推送配置的脚本 启动seata新建项目order-seata项目 订单项目数据库脚本pom.xmlapplication.yml启动类实体类dao类service类controller类feign类mapper类 stock-seata 库存项目数据库脚本pom.xmlappli…...

-bash: cd: /etc/hadoop: 没有那个文件或目录

解决办法&#xff1a;source /etc/profile 运行 source /etc/profile 命令会重新加载 /etc/profile 文件中的配置&#xff0c;这样做的目的是使任何更改立即生效&#xff0c;而不需要注销并重新登录用户。通常&#xff0c;/etc/profile 文件包含系统范围的全局 Shell 配置&…...

JVM字节码与类加载——字节码指令集与解析

文章目录 1、概述1.1、字节码与数据类型1.2、指令分类 2、加载与存储指令2.1、局部变量入栈指令2.2、常量入栈指令2.3、出栈装入局部变量表指令 3、算术指令3.1、彻底理解i与i3.2、比较指令 4、类型转换指令4.1、宽化类型转换4.2、窄化类型转换 5、对象、数组的创建与访问指令5…...

景芯2.5GHz A72训练营dummy添加(一)

景芯A72做完布局布线之后导出GDS&#xff0c;然后进行GDS merge&#xff0c;然后用Calibre对Layout添加Dummy。在28nm以及之前的工艺中&#xff0c;Dummy metal对Timing的影响不是很大&#xff0c;当然Star RC也提供了相应的解决方案&#xff0c;可以考虑Dummy metal来抽取RC。…...

React - 请你说一说setState是同步的还是异步的

难度级别:中高级及以上 提问概率:70% 在React项目中,使用setState可以更新状态数据,而不能直接使用为this.state赋值的方式。而为了避免重复更新state数据,React首先将state添加到状态队列中,此时我们可以通过shouldComponentUpdate这个钩…...

设计模式之命令模式(下)

2&#xff09;完整解决方案 1.结构图 FBSettingWindow是“功能键设置”界面类&#xff0c;FunctionButton充当请求调用者&#xff0c;Command充当抽象命令类&#xff0c;MinimizeCommand和HelpCommand充当具体命令类&#xff0c;WindowHanlder和HelpHandler充当请求接收者。 …...

【opencv】示例-demhist.cpp 调整图像的亮度和对比度,并在GUI窗口中实时显示调整后的图像以及其直方图。...

#include "opencv2/core/utility.hpp" // 包含OpenCV核心工具库的头文件 #include "opencv2/imgproc.hpp" // 包含OpenCV图像处理的头文件 #include "opencv2/imgcodecs.hpp" // 包含OpenCV图像编码解码的头文件 #include "opencv2/highgui…...

计算机网络---第三天

OSI参考模型与TCP/IP模型 参考模型产生背景&#xff1a; 背景&#xff1a;①兼容性较差&#xff0c;接口不统一 ②不利于排错与维护 ③设备成本高 参考模型概念&#xff1a; 概念&#xff1a;OSI参考模型定义了网络中设备所遵守的层次结构 参考模型优点&#xff1a; 优点…...

怎么防止文件被拷贝,复制别人拷贝电脑文件

怎么防止文件被拷贝&#xff0c;复制别人拷贝电,脑文件 防止文件被拷贝通常是为了保护敏感数据、知识产权或商业秘密不被未经授权的人员获取或传播。以下列出了一系列技术手段和策略&#xff0c;可以帮助您有效地防止文件被拷贝。 1. 终端管理软件&#xff1a; 如安企神、域智…...

流式密集视频字幕

流式密集视频字幕 摘要1 IntroductionRelated Work3 Streaming Dense Video Captioning Streaming Dense Video Captioning 摘要 对于一个密集视频字幕生成模型&#xff0c;预测在视频中时间上定位的字幕&#xff0c;理想情况下应该能够处理长的输入视频&#xff0c;预测丰富、…...

【教程】iOS Swift应用加固

&#x1f512; 保护您的iOS应用免受恶意攻击&#xff01;在本篇博客中&#xff0c;我们将介绍如何使用HTTPCORE DES加密来加固您的应用程序&#xff0c;并优化其安全性。通过以下步骤&#xff0c;您可以确保您的应用在运行过程中不会遭受数据泄露和未授权访问的风险。 摘要 …...

新型基础设施建设(新基建)

新型基础设施建设&#xff08;新基建&#xff09;主要包括七个方面&#xff0c;即5G基站建设、特高压、城际高速铁路和城市轨道交通、新能源汽车充电桩、大数据中心、人工智能和工业互联网。 以下是新型基础设施的详细内容&#xff1a; 一、5G基站建设。5G网络的扩展和优化&a…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...