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:
            break
        frame_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 = 0
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        if frame_number % sampling_rate == 0:
            frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            yield Image.fromarray(frame_rgb)
        frame_number += 1


print("保存为 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()

效果:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YashanDB为新质生产力赋能 灌注合肥区域转型源动力

当前,数据要素已成为我国数字经济的“核心引擎”与“关键生产要素”,为全面激发数据要素的价值,各地区正积极探索数据要素交易平台的可行模式,加快在数据要素领域的布局。近日,深圳计算科学研究院崖山数据库系列产品受…

win10系统打开Windows更新是空白的如何解决?

最近装wsl的时候,遇到了这个问题。查阅了很多相关资料,发现导致wsl --install安装不了的主要原因都集中在于windows更新组件损坏导致的,经过排查,我的这个组件确实不能够正常使用,可能是因为之前使用了windows激活工具…

【Java Web】PostMan业务接口测试工具

目录 一、PostMan概述 二、如何安装Postman 三、Postman的基本使用 一、PostMan概述 在生产环境中,一个项目在开发之前、前后端开发工程师通常需要商讨在前后端数据交互时需要采用什么样的规范格式,如:前端向后端发送请求的uri、请求和响…

vue2.0项目安装依赖 sass 报错

1、报错代码: 2、原因:项目有点老,vue2的版本,所以node-sass在npm安装的时候大概率的会安装出错,或下载时间过长,因此考虑用dart-sass来替换。 npm install node-sassnpm:dart-sass3、然后就可以成功运行了…

【PTA】7-1 网红点打卡攻略(C/C++)代码实现 反思

解题细节分析: 0.比较图的两种存储方法,通过邻接矩阵存储更便于查找给定两点之间的关系 1.注意理解清楚题义:“访问所有网红点”中所有不是指攻略中所有,而是存在的全部的网红点 代码见下:// 需要注明的是&#xff…

音频剪辑技巧:音频降噪在线怎么降噪?分享7种录音去除杂音方法

相信很多小伙伴们都有这种苦恼:在编辑音频时,你可能发现即使你使用了价格昂贵的隔音麦克风,在录音中仍然存在呼吸声和咳嗽声。因此,如果要传达清晰干净的声音以表达你的信息,你该如何从录音去除杂音呢?别心…

理清时间复杂度和空间复杂度

目录 复习时间 幂函数 指数函数 对数函数 ​编辑 时间复杂度 推导阶的原则 常见的时间复杂度举例 常数阶 O(1) 对数阶 O(logn) 平方阶 O(n^2) 图像表示 空间复杂度 常见的空间复杂度举例 常数阶 O(1) 线性阶 O(n) 平方阶 O(n^2) 一个算法的优劣主要从算法的执行时间和所需要占…

elementUI的衍生组件,avue的crud表格错位问题

问题描述: 每次从别的页面跳转回来就发现表格显示错位了 一通查 结果发现是有两层表格 解决办法: 根据开发者工具中看到的样式选择器,很粗暴的在全局样式文件中加一个: 效果:

CDP问卷的常见问题

CDP问卷的常见问题可以归纳如下: 哪些企业会收到CDP邀请? 企业会收到来自投资和/或采购机构的邀请,以填写CDP问卷并披露相应的环境管理信息。 未收到邀请的企业可否填报? 未收到邀请的企业可以选择自行填报。他们需发送申请自愿…

[论文阅读笔记33] Matching Anything by Segmenting Anything (CVPR2024 highlight)

这篇文章借助SAM模型强大的泛化性,在任意域上进行任意的多目标跟踪,而无需任何额外的标注。 其核心思想就是在训练的过程中,利用strong augmentation对一张图片进行变换,然后用SAM分割出其中的对象,因此可以找到一组图…

Session会话与请求域的区别

session会话和请求域(也称为request域)都是用于存储和管理用户特定信息的重要概念,但它们在作用范围和生命周期上有显著的不同。 请求域 (Request Domain) 作用范围:请求域是面向单次请求的。每次HTTP请求都会创建一个新的request…

【实战教程】如何使用JMeter来轻松测试WebSocket接口?

1、websocket接口原理 打开网页:从http协议,升级到websocket协议,请求建立websocket连接服务器返回建立成功成功客户端向服务端发送匹配请求服务端选择一个客服上线服务器返回客服id客户端向服务器发送消息服务器推送消息给指定的客服服务器…

EXCEL快速填充空白内容

** EXCEL快速填充空白内容 ** 1.全选所有需要填充的内容,按住电脑的F5或者CTRLG点击定位 2.可以看到空白处被自动选定,之后按电脑和⬆,最后CTRLenter 可以看到空白处已经被填充。

C#——this关键字详情

this关键字 在 C# 中,可以使用 this 关键字来表示当前对象,日常开发中我们可以使用 this 关键字来访问类中的成员属性以及函数。 使用this表示当前类的对象 执行结果 使用 this 关键字串联构造函数 执行结果 使用 this 关键字作为类的索引器 执行结果 …

02逻辑代数与硬件描述语言基础

2.1 逻辑代数(简单逻辑的运算) 2.2 逻辑函数的卡诺图(从图论的角度)化简法 2.3 硬件描述语言Verilog HDL基础(研究生阶段才用得到) 要求: 1、熟悉逻辑代数常用基本定律、恒等式和规则。 2、掌握…

蒸汽架空管道中的关键守护者:滑动管托、导向管托与固定管托

蒸汽架空管道中的关键守护者:滑动管托、导向管托、固定管托与补偿器的重要角色在蒸汽架空管道系统中,每一个组件都扮演着不可或缺的角色,共同确保管道的安全、高效运行。今天,我们就来深入探讨滑动管托、导向管托、固定管托以及补…

用一个实例看如何分享大量照片 续篇二,关于Exif (Exchangeable Image File) - 可交换图像文件

续篇二:说说关于照片隐含的 Exif (Exchangeable Image File) 可交换图像文件 数码照片的Exif 参数有很多,重要的Exif信息:拍摄日期、时间、拍摄器材、GPS信息。 当然这主要对自己的档案有意义,如果放到网上还是建议抹去这些信息。…

50etf期权合约一手多少钱你知道吗?

今天带你了解50etf期权合约一手多少钱你知道吗?50etf期权有不同价值的合约,每手50etf期权合约从几元到几百元再到上千元的都有,具体需要根据投资者选择了什么价值的合约。 50etf期权权利金 50ETF期权合约的权利金是买方需要缴纳的费用&…

Asm动态生成类和get and set方法

asm在解析文件的时候是按照特定顺序进行分析的,首先是visit方法,做类相关的解析,然后是注解,然后是属性,最后才是方法,属性是在所有方法分析前面进行,也就是只有当class文件中的所有属性都遍历完…

GMSB文章五:微生物组差异分析ANCOMBC-2

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 微生物的物种差异分析是一项关键的生物信息学任务,旨在识别不同生物群落或样本组…