python-(opencv)视频转glf

文章目录

  • 前言
    • python-(opencv)视频转glf
      • 1. 下载 opencv-python
      • 2. cv2(OpenCV)和imageio的区别
      • 3. demo源码

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


python-(opencv)视频转glf

cv2(OpenCV)和imageio 都可以用来将视频转出glf的的python库。
我这里使用的是cv2(OpenCV)python库来做视频转glf demo。

1. 下载 opencv-python

pip install opencv-python

在这里插入图片描述

2. cv2(OpenCV)和imageio的区别

功能和应用场景:

OpenCV (cv2):OpenCV 是一个功能强大的计算机视觉库,支持广泛的图像处理、计算机视觉和机器学习任务,如图像处理、视频处理、对象检测与跟踪、人脸识别等。它提供了丰富的算法和函数,适用于复杂的计算机视觉项目。
imageio:imageio 是一个用于读写多种图像和视频格式的库。它的主要功能是方便地读取和写入图像和视频文件,支持多种格式,并且可以直接处理GIF动画等。imageio 的设计更加简洁,专注于图像和视频的I/O操作。
易用性和适用范围:

OpenCV 在处理复杂的计算机视觉任务时更为强大和灵活,提供了丰富的图像处理算法和功能。
imageio 更适合于简单的图像和视频读写操作,特别是对于处理少量数据或需要快速实现的任务而言更为便捷。
依赖和兼容性:

OpenCV 需要依赖于底层的计算机视觉和数值计算库,如 numpy 等,而且需要正确配置编译环境,适应性较强。
imageio 设计简单,依赖较少,适用于快速安装和使用的场景。
社区和支持:

OpenCV 是一个广为人知且使用广泛的开源项目,有一个活跃的社区支持和大量的文档资源。
imageio 也有不少用户和社区支持,但相对于OpenCV来说,其社区和文档资源可能较少。


因此选择使用哪个库取决于你的具体需求和项目复杂性。如果需要进行复杂的计算机视觉任务或者需要丰富的图像处理功能,推荐使用 OpenCV (cv2)。如果只需进行简单的图像和视频读写操作,并希望快速上手,那么 imageio 是一个不错的选择。

3. demo源码

import cv2
from PIL import Image
import time# 视频文件路径
video_path = 'D:/嗨格式录屏文件/test.mp4'# 打开视频文件
cap = cv2.VideoCapture(video_path)# 获取视频帧率和总帧数
fps = int(cap.get(cv2.CAP_PROP_FPS))
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(f'视频帧率:{fps}')
print(f'总帧数:{frame_count}')# 图片尺寸(这里使用视频的默认尺寸)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 逐帧读取视频并保存为图片
def read_frames():while True:ret, frame = cap.read()if not ret:breakframe_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  # 将 OpenCV 的 BGR 格式转换为 RGB 格式yield Image.fromarray(frame_rgb)  # 将 NumPy 数组转换为 PIL 图像对象print("保存为 GIF 动画")# 记录开始时间
start_time = time.time()# 保存为 GIF 动画
images = list(read_frames())images[0].save('D:/嗨格式录屏文件/test.gif',save_all=True,append_images=images[1:],duration=int(1000 / fps),  # 每帧间隔时间(毫秒)loop=0)                   # 循环次数(0 表示无限循环)# 计算耗时
elapsed_time = time.time() - start_time
print(f"视频转换为 GIF 图片成功,耗时: {elapsed_time:.2f} 秒。")# 释放视频文件资源
cap.release()

效果:
请添加图片描述
在这里插入图片描述
可以看到耗时6分钟,时间还是比较久的,这种场景下,可以采取优化
【调整帧采样率】【使用其他视频处理库】(虑使用其他专门用于视频处理和转换的库,比如 moviepy 或 imageio。它们可能针对性能和效率进行了优化,可以比原生 OpenCV 更快速地进行帧的读取和处理。)、调【整保存参数】(整保存 GIF 图像时的参数,例如调整每帧的间隔时间、循环次数等。有时候减少帧率或减少循环次数可以减少处理时间),【使用多线程或异步处理】(在读取帧和保存图像时,可以考虑使用多线程或异步处理。这样可以并行处理帧的读取和图像的保存,提高整体处理速度),【降低图像尺寸和质量】(如果目标是减少文件大小或简化处理过程,可以在保存 GIF 图像时降低图像的尺寸和质量。这会减少每帧的处理时间和最终 GIF 文件的大小)。

下面是通过调整调整帧采样率的demo:

import cv2
from PIL import Image
import time# 视频文件路径
video_path = 'D:/嗨格式录屏文件/test.mp4'# 打开视频文件
cap = cv2.VideoCapture(video_path)# 获取视频帧率和总帧数
fps = int(cap.get(cv2.CAP_PROP_FPS))
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(f'视频帧率:{fps}')
print(f'总帧数:{frame_count}')# 图片尺寸(这里使用视频的默认尺寸)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 逐帧读取视频并保存为图片(增加帧采样率)
def read_frames(sampling_rate=2):frame_number = 0while True:ret, frame = cap.read()if not ret:breakif frame_number % sampling_rate == 0:frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)yield Image.fromarray(frame_rgb)frame_number += 1print("保存为 GIF 动画")# 记录开始时间
start_time = time.time()# 调整帧采样率为每隔2帧保存一次图像
images = list(read_frames(sampling_rate=2))
images[0].save('D:/嗨格式录屏文件/test.gif',save_all=True,append_images=images[1:],duration=int(1000 / fps),  # 每帧间隔时间(毫秒)loop=0)                   # 循环次数(0 表示无限循环)# 计算耗时
elapsed_time = time.time() - start_time
print(f"视频转换为 GIF 图片成功,耗时: {elapsed_time:.2f} 秒。")# 释放视频文件资源
cap.release()

效果:

在这里插入图片描述
明显生成时间减少很多。

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

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

相关文章

youlai-boot项目的学习(4) 前后端本地部署

环境 1、macOS, brew, IntelliJ IDEA, WebStrom 2、后端:https://gitee.com/youlaiorg/youlai-boot.git , master, 9a753a2e94985ed4cbbf214156ca035082e02723 3、前端:https://gitee.com/youlaiorg/vue3-element-admin.git, master, 66b913ef01dc880ad…

mobaxterm x11 转发Ubuntu mac

目录 royal tsx —— 一款Mac平台MobaXterm平替工具 mobaxterm x11 转发Ubuntu 软件 royal tsx —— 一款Mac平台MobaXterm平替工具 Royal Apps Termius Mac mobaxterm x11 转发Ubuntu 软件 所以直接在 ssh 的时候加上 - X 就可以了 ssh -X -p xxx usernameIP 运行 xclock …

递归函数设计技巧

如何设计递归函数 要学会如何设计递归函数,首先要识别什么样的问题才适合递归函数求解,那么我们可以通过数学归纳法,分析问题,观察问题是否符合相关性质。 数学归纳法 数学归纳法,是一种基本的数学证明方法&#xff0c…

深度解析RocketMq源码-IndexFile

1.绪论 在工作中,我们经常需要根据msgKey查询到某条日志。但是,通过前面对commitLog分析,producer将消息推送到broker过后,其实broker是直接消息到达broker的先后顺序写入到commitLog中的。我们如果想根据msgKey检索一条消息无疑…

Zookeeper:基于Zookeeper的分布式锁

一、Zookeeper分布式锁原理 二、Zookeeper JavaAPI操作 1、Curator介绍 Curator是Apache Zookeeper的Java客户端。常见的Zookeeper Java API: 原生Java API。ZkClient。Curator。 Curator项目目标是简化Zookeeper客户端的使用。Curator最初是Netfix研发的&#xf…

LIMS系统选型时应该避免哪些误区呢

LIMS实验室管理系统在选型、实施及使用过程中,确实存在一些常见的误区。以下是对这些误区的详细解析和归纳: 一、误区 1、只关注功能而忽视用户需求 在LIMS系统的选型过程中,实验室可能过于关注系统的功能和技术特性,而忽视了实…

42.option方法给服务端和客户端配置参数

客户端是Bootstrap.option方法配置参数。 服务端有两个: 1.ServerBootstrap.option方法,给ServerSocketChannel配置参数的。 2.ServerBootstrap.childOption方法,给SocketChannel配置参数的。 package com.xkj.client;import com.xkj.message.*; import com.xkj.protoco…

K近邻回归原理详解及Python代码示例

K近邻回归原理详解 K近邻回归(K-Nearest Neighbors Regression, KNN)是一种基于实例的学习算法,用于解决回归问题。它通过找到输入数据点在特征空间中最相似的K个邻居(即最近的K个数据点),并使用这些邻居的…

C++11的可变参数模板

可变参数模板 什么是可变参数模板的可变参数展开参数包emplace系列函数引例emplace系列函数 什么是可变参数 printf和scanf中就涉及可变参数 这里三个点就代表可变参数,意思就是不管你传多少个参数,都可以接收 printf("%d",x); printf("…

狼牙山短视频:成都柏煜文化传媒有限公司

狼牙山短视频:记录自然与历史的交融 随着短视频的兴起,我们得以在短短几分钟内,跨越千山万水,领略世界各地的风情。成都柏煜文化传媒有限公司 而今天,我想带大家走进一个独特的地方——狼牙山,通过一系列短…

centos挂载新的磁盘

如果是vmware的话,在管理界面,为虚拟机创建一个新的磁盘,然后需要给这个磁盘分区 https://juejin.cn/post/6987200157733371935 1、执行如下命令,查询磁盘分区的UUID。 blkid 磁盘分区 以查询磁盘分区“/dev/vdb1”的UUID为例&am…

Spring Boot中的异常处理策略

Spring Boot中的异常处理策略 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Spring Boot应用程序中如何有效地处理异常,保证系统的…

Transformer教程之Transformer的历史背景

在现代人工智能领域,Transformer模型已经成为一种不可或缺的技术,它在自然语言处理(NLP)和计算机视觉等多个领域取得了巨大的成功。本文将带你回顾Transformer的历史背景,了解它是如何从最初的构想到今天的广泛应用的。…

英国Essay写作攻略怎么才算详细?

写Essay是所有英国留学生都要面对的,很多刚到英国的留学生为了拿到一个完美的成绩单,都会选择找人Essay写作,从而拿到高分。可是你有没有想过,为什么Essay写作能拿高分,而自己写的Essay一直在及格线边上徘徊&#xff0…

Element-UI表单验证 二选一、三选一、多选一验证

Element-UI表单验证二选一验证 在表单提交过程中很多时候要用到几个表单项二选一验证或多选一验证,比如联系方式中的手机号和固定电话只需要填写一项就可通过验证,针对这样情况可以使用Element-UI的自定义验证实现,具体实现方法如下。 HTML…

Web渗透:文件包含漏洞

Ⅱ.远程文件包含 远程文件包含漏洞(Remote File Inclusion, RFI)是一种Web应用程序漏洞,允许攻击者通过URL从远程服务器包含并执行文件;RFI漏洞通常出现在动态包含文件的功能中,且用户输入未经适当验证和过滤。接着我…

520. 检测大写字母 Easy

我们定义,在以下情况时,单词的大写用法是正确的: 全部字母都是大写,比如 "USA" 。 单词中所有字母都不是大写,比如 "leetcode" 。 如果单词不只含有一个字母,只有首字母大写&#xff0…

生产者发送数据,kafka服务器接收数据异常的问题记录

现象: 某个客户要求审计日志用kafka的方式传输给他们,使用了第三方的librdkafka库来开发。 往客户提供的kafka服务器上的一个topic发送数据,这个topic有三个分区,客户反馈接收到的数据和发送端发送的实际数量对不上,他…

代码随想录第五十二天打卡

647. 回文子串 动态规划解决的经典题目&#xff0c;如果没接触过的话&#xff0c;别硬想 直接看题解。 代码随想录 class Solution { public:int countSubstrings(string s) {vector<vector<bool>>dp(s.size(),vector<bool>(s.size(),false));int res0;for …