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

【Python入门教程】基于OpenCV视频分解成图片+图片组合成视频(视频抽帧组帧)

        在人工智能爆火的今天,深度学习被广泛应用于各个领域。深度学习的模型训练离不开大量的样本库。我之前分享过【Python爬虫】批量爬取网页的图片&制作数据集,今天跟大家分享一下如何使用OpenCV库对视频进行抽帧,从而增加样本图片的数量。正好也顺便分享一下如何再将图片组合成视频。当然视频的抽帧组帧还可以应用到很多邻域,我这里是用在制作样本的。

1 视频分解图片(拆帧)

1.1 主函数介绍+代码

        cv2.VideoCapture()是OpenCV库中的一个函数,用于读取视频文件或实时视频流。它返回一个视频捕获对象,可以通过这个对象进行视频的读取、操作和释放等操作。

        使用cv2.VideoCapture()可以读取视频文件或实时视频流中的每一帧图像。通过循环读取帧,可以获取视频中的所有帧。

        这里入参中的target_frame是指间隔多少帧保存一张图片,如果输入1,则全部保存。若视频帧率为60(每秒60张图片),你设置target_frame为120,则两秒保存一张图片。

def Frame_video(video_path, out_path, target_frame=1):""":param video_path: 需要拆帧的视频路径:param out_path: 拆帧后图片保存路径:param target_frame: 抽取帧数间隔,默认为1,即1帧保存1张图片:return: None"""print("-------------------------视频抽帧-------------------------")if not os.path.exists(out_path):# 判断文件夹是否存在os.makedirs(out_path)video = cv2.VideoCapture()  # 初始化一个OpenCV的视频读取对象video.open(video_path)count = 0  # 记录当前帧数image_index = 1000001  # 用于保存图片名称frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))  # 获取帧数print('视频共%s帧,抽取%s帧......' % (frames, int(frames/target_frame)))while True:_, frame = video.read()if frame is None:# print("第%s帧图片无法打开!" % count)breakif count % target_frame == 0:if int((image_index-1000000) / int(frames/target_frame) * 100) in [20, 40, 60, 80]:print("已提取百分之%s,剩余%s帧......" %(int((image_index-1000000) / int(frames/target_frame) * 100),int(frames / target_frame) - image_index + 1000000))save_path = out_path + "%s.png" % image_indexcv2.imwrite(save_path, frame)image_index += 1count += 1video.release()print("视频已全部抽帧完成......")print("-------------------------抽帧完成-------------------------")

1.2 完整代码

# -*- coding: utf-8 -*-
"""
@Time : 2023/10/25 14:26
@Auth : RS迷途小书童
@File :Video Frame Images.py
@IDE :PyCharm
@Purpose:视频拆帧成图片
"""
import os
import sys
import cv2def Frame_video(video_path, out_path, target_frame=1):""":param video_path: 需要拆帧的视频路径:param out_path: 拆帧后图片保存路径:param target_frame: 抽取帧数间隔,默认为1,即1帧保存1张图片:return: None"""print("-------------------------视频抽帧-------------------------")if not os.path.exists(out_path):# 判断文件夹是否存在os.makedirs(out_path)video = cv2.VideoCapture()  # 初始化一个OpenCV的视频读取对象video.open(video_path)count = 0  # 记录当前帧数image_index = 1000001  # 用于保存图片名称frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))  # 获取帧数print('视频共%s帧,抽取%s帧......' % (frames, int(frames/target_frame)))while True:_, frame = video.read()if frame is None:# print("第%s帧图片无法打开!" % count)breakif count % target_frame == 0:if int((image_index-1000000) / int(frames/target_frame) * 100) in [20, 40, 60, 80]:print("已提取百分之%s,剩余%s帧......" %(int((image_index-1000000) / int(frames/target_frame) * 100),int(frames / target_frame) - image_index + 1000000))save_path = out_path + "%s.png" % image_indexcv2.imwrite(save_path, frame)image_index += 1count += 1video.release()print("视频已全部抽帧完成......")print("-------------------------抽帧完成-------------------------")if __name__ == '__main__':print("\n-------------------------基础信息-------------------------")Video_path = r'G:\D.MP4'save_dir = r'B:\YOLO\18/'video1 = cv2.VideoCapture()  # 初始化一个OpenCV的视频读取对象if not video1.open(Video_path):print("无法打开视频,请检查数据!")sys.exit()fps = video1.get(cv2.CAP_PROP_FPS)  # 获取帧率frame_count = int(video1.get(cv2.CAP_PROP_FRAME_COUNT))  # 获取视频的总帧数video1.release()  # 清理缓存duration = frame_count / fps  # 计算视频的时长(秒)print("视频时长为: %ss" % int(duration))print("视频帧率为: %sFPS" % int(fps))print("视频帧数为: %s" % int(frame_count))Frame = int(input("请输入抽取帧数间隔:"))Frame_video(Video_path, save_dir, Frame)

2 图片组合视频(组帧)

2.1 主函数介绍+代码

        cv2.VideoWriter函数用于将录制的视频保存成文件。它需要指定文件路径、编码器、帧率和视频尺寸等参数。

def Image_Frame(images_path, out_path, fps):""":param images_path: 输入需要组帧的图片文件夹路径:param out_path: 输出视频路径:param fps: 视频帧率:return: None"""print("-------------------------图片组帧-------------------------")images_lists = os.listdir(images_path)  # images_lists.sort()image_size = Image.open(os.path.join(images_path, images_lists[0])).sizefourcc = cv2.VideoWriter_fourcc(*"mp4v")video_writer = cv2.VideoWriter(out_path, fourcc, fps, image_size)for image_list in images_lists:image_path = os.path.join(images_path, image_list)frame = cv2.imread(image_path)video_writer.write(frame)print("正在添加:", image_list)video_writer.release()print("-------------------------组帧完成-------------------------")

2.2 完整代码

# -*- coding: utf-8 -*-
"""
@Time : 2023/10/25 16:00
@Auth : RS迷途小书童
@File :Images Frame Video.py
@IDE :PyCharm
@Purpose:图片组帧成视频
"""
import os
import cv2
from PIL import Imagedef Image_Frame(images_path, out_path, fps):""":param images_path: 输入需要组帧的图片文件夹路径:param out_path: 输出视频路径:param fps: 视频帧率:return: None"""print("-------------------------图片组帧-------------------------")images_lists = os.listdir(images_path)  # images_lists.sort()image_size = Image.open(os.path.join(images_path, images_lists[0])).sizefourcc = cv2.VideoWriter_fourcc(*"mp4v")video_writer = cv2.VideoWriter(out_path, fourcc, fps, image_size)for image_list in images_lists:image_path = os.path.join(images_path, image_list)frame = cv2.imread(image_path)video_writer.write(frame)print("正在添加:", image_list)video_writer.release()print("-------------------------组帧完成-------------------------")if __name__ == "__main__":Image_path = r'G:\1/'Out_path = r'G:\1.mp4'FPS = int(input("请输入帧率:"))Image_Frame(Image_path, Out_path, FPS)

        本次博文就分享到这,如果大家有RS、GIS、Python方面的问题,欢迎大家留言交流。我们一起学习进步!

相关文章:

【Python入门教程】基于OpenCV视频分解成图片+图片组合成视频(视频抽帧组帧)

在人工智能爆火的今天,深度学习被广泛应用于各个领域。深度学习的模型训练离不开大量的样本库。我之前分享过【Python爬虫】批量爬取网页的图片&制作数据集,今天跟大家分享一下如何使用OpenCV库对视频进行抽帧,从而增加样本图片的数量。正…...

微前端qiankun接入Vue和React项目

主应用:Vue3Webpack 1、创建主应用: npx vue create main-vue3-app 2、安装qiankun npx yarn add qiankun 3、项目中使用的vue、vue-router、qiankun依赖如下,webpack版本为5.x 4、在根目录下创建vue.config.js const { defineConfig }…...

提升技能,一触即达!全新在线题库微信小程序等你来挑战!

亲爱的同学们,你是否在准备各种专业认证考试时,感到题目繁多,复习困难?你是否在寻找一个能够提供全方位、各级别认证考试题库的在线学习平台? 今天,我们为你带来了一款全新的在线题库微信小程序——KD蝌蚪阿…...

语雀P0级故障复盘,有9个字亮了

大家好,我是洋子 最近语雀不是出了个号称 “载入史册” 的 P0 级事故嘛 —— 连续宕机接近8个小时无法使用,作为一个大厂知名产品,这个修复速度属实让人无法理解 故障公告原文:https://mp.weixin.qq.com/s/WFLLU8R4bmiqv6OGa-QMc…...

在 openresty 中使用 capnp lua 库

1. 安装必要的工具和库 apt-get install capnproto luarocksluarocks install lua-capnproto luarocks install lua-cjsonlua-cjson 库不是必须的,是由于后面的演示程序要使用,就一起装上了。 可以看下库的安装位置: root350983744ebf:~# …...

私藏小技巧:让微信朋友圈营销方便化的小窍门!

微信,这个拥有十亿用户的社交软件,已经成为生活中不可或缺的一部分。 而朋友圈,这个微信的基础功能,是聚宝盆,也是一切流量的尽头。 现在公域+私域的流量增长变现体系很火。朋友圈是一切公域流量的尽头&a…...

Centos使用tomcat部署jenkins

jenkins的最新版本已经不在支持jdk8,支持的jdk环境如下: 安装jdk环境 yum -y install java-11-openjdk.x86_64 java-11-openjdk-devel.x86_64安装tomcat tomcat官网 cd /optwget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.82/bin/apache-tomcat…...

uni-app打包apk实现自动更新

一、直接复制粘贴就可用(豪横) app.vue文件里写 //app.vue里写 <script>export default {onShow: function() {console.log(App Show)},onHide: function() {console.log(App Hide)},onLaunch: function() {let appVersion uni.getSystemInfo({success: function(e) {ap…...

SRS srs-bench

1 srs-bench 音视频压测工具&#xff0c;包括RTMP/FLV/WebRTC/GB28181等&#xff0c;未来还会完善。 SB(SRS Bench) is a set of benchmark and regression test tools, for SRS and other media servers, supports HTTP-FLV, RTMP, HLS, WebRTC and GB28181. For RTMP/HLS/F…...

HackTheBox-Starting Point--Tier 1---Appointment

文章目录 一 题目二 实验过程 一 题目 Tags Web、Databases、Injection、Apache、MariaDB、PHP、SQL、Reconnaissance、SQL Injection译文&#xff1a;Web、数据库、注入、Apache、MariaDB、PHP、SQL、侦察、SQL 注入Connect To attack the target machine, you must be on …...

【工具】Java请求带http重定向的地址 自动进行重定向

【工具】Java请求带http重定向的地址 自动进行重定向 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL;public class HTTPGETWithMultipleHeaders {public static voi…...

接口自动化测试方案

1、引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 V1.0 项目经理 XX 测试人员 XXXXX&#xff0c;XXX 所属部门 XX 备注 1.3 文档目的 本文档主要用于指导XXX-YY项目常用接口自动化测试…...

TikTok文化探索:热议时事与社会话题

在当今数字时代&#xff0c;社交媒体平台如TikTok已经成为了我们日常生活中不可或缺的一部分。它不仅仅是一个娱乐应用&#xff0c;也是一扇窥视世界、探讨时事和社会话题的窗户。本文将深入探讨TikTok如何成为文化探索的平台&#xff0c;热议时事和社会话题&#xff0c;以及它…...

springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作

第一步&#xff1a;在mongodb的官网里面创建云服务器 点进去 这是免费的&#xff0c;由于是一个项目只可以创建一个&#xff0c;这里我已经创建好了 用本地的mongodb服务也是可以的 第二步&#xff1a;点击connect,下载连接mongodb的软件&#xff1a;MongoDBCompass 第三步&am…...

QWEN technical report

通义千问-Qwen技术报告细节分享 - 知乎写在前面大家好&#xff0c;我是刘聪NLP。 阿里在很早前就开源了Qwen-7B模型&#xff0c;但不知道为什么又下架了。就在昨天阿里又开源了Qwen-14B模型&#xff08;原来的7B模型也放出来了&#xff09;&#xff0c;同时还放出了Qwen的技术报…...

提升MODBUS-RTU通信数据刷新速度的常用方法

SMART PLC的MODBUS-RTU通信请参考下面文章链接: 【精选】PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)-CSDN博客MODBUS通讯非常简单、应用也非常广泛,有些老生常谈的问题,这里不再赘述,感兴趣的可以参看我的其它博文:SMART200PLC MODBUS通讯专题_RXXW…...

PyTorch 与 TensorFlow:机器学习框架之战

深度学习框架是简化人工神经网络 (ANN) 开发的重要工具&#xff0c;并且其发展非常迅速。其中&#xff0c;TensorFlow 和 PyTorch 脱颖而出&#xff0c;各自在不同的机器学习领域占有一席之地。但如何为特定项目确定理想的工具呢&#xff1f;本综合指南[1]旨在阐明它们的优点和…...

超简单理解冒泡排序

1.冒泡排序(Bubble Sort) 较简单排序算法。 它会遍历若干次要排列的数列&#xff0c;每次遍历&#xff0c;会从前往后比较相邻两个数的大小。 如果前者比后者大&#xff0c;就交换他们位置。遍历一次最大元素在数列末尾。重复直到数列有序。 那么遍历需要一个变量控制范围。…...

模拟IC设计工程师成长日记

很多IC设计的新人&#xff0c;不知道进入IC设计行业后会有哪些成长和学习的地方。 很多初入IC设计职场的人也都会比较恐慌&#xff0c;成长进步需要一个时间和经验的积累 今天给大家找了一个叫“模拟IC设计“攻城狮”的成长日记供大家参考. 以模拟IC设计工程师的身份进入职场&a…...

修炼k8s+flink+hdfs+dlink(六:学习namespace,service)

一&#xff1a;什么是namespace&#xff1f; 你可以认为namespaces是你kubernetes集群中的虚拟化集群。在一个Kubernetes集群中可以拥有多个命名空间&#xff0c;它们在逻辑上彼此隔离。 他们可以为您和您的团队提供组织&#xff0c;安全甚至性能方面的帮助&#xff01; 二&a…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...