python 读取视频有多少帧并将视频转为GIF动态图

news/2025/2/26 7:24:23

目录

1 python读取视频帧

2 python 将MP4格式视频前500帧转为动态图

3 python 将MP4格式视频第2688到2890帧转为动态图,并将gif图片的七分之一列和后七分之一列裁掉

4 python 将MP4格式视频第2688到2890帧转为动态图,并将gif图片的七分之一行和后七分之一行裁掉

1 python读取视频帧

要读取视频有多少帧,可以使用Python中的OpenCV库。以下是一个示例代码:

import cv2

# 打开视频文件
cap = cv2.VideoCapture('path/to/video.mp4')

# 获取视频的帧数
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

# 输出视频的帧数
print(f"The video contains {frame_count} frames.")

# 释放视频对象
cap.release()

        在这个示例中,我们首先使用cv2.VideoCapture()函数打开视频文件,并将其存储在一个变量中。然后,我们使用cap.get(cv2.CAP_PROP_FRAME_COUNT)函数获取视频的帧数,并将其转换为整数类型。最后,我们打印视频的帧数。

        请注意,在完成对视频的操作后,需要使用cap.release()函数释放视频对象。

        值得注意的是,使用OpenCV库可以更加高效和稳定地处理视频文件。

2 python 将MP4格式视频前500帧转为动态图

        要将MP4格式视频的前500帧转换为动态图,您可以使用Python中的OpenCV库和imageio库。以下是一个示例代码:

import cv2
import imageio

# 打开视频文件
cap = cv2.VideoCapture('path/to/video.mp4')

# 获取视频帧率和尺寸
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 创建输出GIF文件的对象
output_file = 'path/to/output.gif'
writer = imageio.get_writer(output_file, fps=fps)

# 读取视频的前500帧
for i in range(500):
    ret, frame = cap.read()
    if ret:
        # 将帧转换为RGB格式,并将其添加到GIF文件中
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        writer.append_data(frame)
    else:
        break

# 关闭视频对象和输出GIF文件对象
cap.release()
writer.close()

# 打印完成消息
print(f"Successfully converted the first 500 frames of the video to '{output_file}'.")

        在这个示例中,我们首先使用cv2.VideoCapture()函数打开视频文件,并获取视频的帧率和尺寸。然后,我们使用imageio.get_writer()函数创建输出GIF文件的对象,并设置帧率。

        接下来,我们使用for循环读取视频的前500帧。对于每一帧,我们首先使用cap.read()函数读取帧,并将其存储在一个变量中。如果读取成功,我们将使用cv2.cvtColor()函数将帧转换为RGB格式,并使用writer.append_data()函数将其添加到输出GIF文件中。

        当循环结束后,我们使用cap.release()函数关闭视频对象和writer.close()函数关闭输出GIF文件对象。最后,我们打印一个完成消息。

        请注意,在完成对视频的操作后,需要释放视频对象并关闭输出GIF文件对象。此外,如果希望转换的帧数不是固定的,可以将range(500)替换为适当的范围。

3 python 将MP4格式视频第2688到2890帧转为动态图,并将gif图片的七分之一列和后七分之一列裁掉

import cv2
import imageio

# 打开视频文件
cap = cv2.VideoCapture('path/to/video.mp4')

# 获取视频帧率和尺寸
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 计算裁剪后的GIF宽度和高度
cropped_width = width - width // 7 * 2
cropped_height = height

# 创建输出GIF文件的对象
output_file = 'path/to/output.gif'
writer = imageio.get_writer(output_file, fps=fps)

# 读取视频的第2688到2890帧
for i in range(2688, 2891):
    cap.set(cv2.CAP_PROP_POS_FRAMES, i)  # 将帧的位置设置为i
    ret, frame = cap.read()
    if ret:
        # 将帧裁剪为指定的大小,并将其转换为RGB格式
        frame = frame[:, width//7:width-width//7, :]
        frame = cv2.resize(frame, (cropped_width, cropped_height))
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        # 将帧添加到GIF文件中
        writer.append_data(frame)
    else:
        break

# 关闭视频对象和输出GIF文件对象
cap.release()
writer.close()

# 打印完成消息
print(f"Successfully converted frames 2688 to 2890 of the video to '{output_file}' with cropped edges.")

        在这个示例中,我们首先计算裁剪后的GIF宽度和高度,即将GIF的宽度缩小为原来的5/7,并保持高度不变。

        然后,我们使用for循环读取视频的第2688到2890帧。对于每一帧,我们首先使用cap.set(cv2.CAP_PROP_POS_FRAMES, i)函数将帧的位置设置为当前帧的索引i,然后使用cap.read()函数读取帧,并将其存储在一个变量中。

        如果读取成功,我们将使用frame[:, width//7:width-width//7, :]将GIF的第七分之一列和后七分之一列裁掉,再使用cv2.resize()函数将帧裁剪为指定的大小,将其转换为RGB格式,并使用writer.append_data()函数将其添加到输出GIF文件中。

        最后,我们关闭视频对象和输出GIF文件对象,并打印一个完成消息。

        请注意,我们使用了整数除法//来计算要裁剪的列的索引。这是因为GIF的宽度可能不是7的倍数,所以我们需要向下取整以确保我们裁剪正确的列。

4 python 将MP4格式视频第2688到2890帧转为动态图,并将gif图片的七分之一行和后七分之一行裁掉

        如果需要裁剪的是行而不是列,则可以类似地计算裁剪后的GIF宽度和高度,并使用frame[row_start:row_end, :, :]来裁剪每一帧的行。以下是一个示例代码:

import cv2
import imageio

# 打开视频文件
cap = cv2.VideoCapture('path/to/video.mp4')

# 获取视频帧率和尺寸
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 计算裁剪后的GIF宽度和高度
cropped_width = width
cropped_height = height - height // 7 * 2

# 创建输出GIF文件的对象
output_file = 'path/to/output.gif'
writer = imageio.get_writer(output_file, fps=fps)

# 读取视频的第2688到2890帧
for i in range(2688, 2891):
    cap.set(cv2.CAP_PROP_POS_FRAMES, i)  # 将帧的位置设置为i
    ret, frame = cap.read()
    if ret:
        # 将帧裁剪为指定的大小,并将其转换为RGB格式
        frame = frame[height//7:height-height//7, :, :]
        frame = cv2.resize(frame, (cropped_width, cropped_height))
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        # 将帧添加到GIF文件中
        writer.append_data(frame)
    else:
        break

# 关闭视频对象和输出GIF文件对象
cap.release()
writer.close()

# 打印完成消息
print(f"Successfully converted frames 2688 to 2890 of the video to '{output_file}' with cropped edges.")

        在这个示例中,我们使用了类似于前一个示例的方法来计算裁剪后的GIF宽度和高度,但这次我们将GIF的高度缩小为原来的5/7,并保持宽度不变。

        然后,我们使用for循环读取视频的第2688到2890帧,并使用                

  cap.set(cv2.CAP_PROP_POS_FRAMES, i)函数将帧的位置设置为当前帧的索引i

        对于每一帧,我们使用frame[height//7:height-height//7, :, :]来裁剪GIF的第七分之一行和后七分之一行,再使用cv2.resize()函数将帧裁剪为指定的大小,将其转换为RGB格式,并使用writer.append_data()函数将其添加到输出GIF文件中。

        最后,我们关闭视频对象和输出GIF文件对象,并打印一个完成消息。


http://www.niftyadmin.cn/n/200358.html

相关文章

h5|web页面嵌套iframe传参给cocosCreator

h5|web页面嵌套iframe传参给cocosCreator 目录 一、快速浏览 二、详细实现与项目代码 三、安全性评估——iframe 实现效果: 一、快速浏览 在h5页面中,使用JavaScript获取需要传递的参数,如下: var token ZHESHINIDETOKEN; var phone 11…

ld: library not found for -lcrt0.o

ld: library not found for -lcrt0.o 背景: Mac 系统编译的时候报错 语言:golang 原因: 代码使用了静态编译,-static。stack overflow 上说 This option will not work on Mac OS X unless all libraries (including libgcc.a…

自学大数据第16天~Pig安装与配置及其他

Pig简介: Apache Pig是一个用于分析大型数据集的平台,它由用于表达数据分析程序的高级语言以及用于评估这些程序的基础架构组成。 Pig程序的显着特性是它们的结构适合大量的并行化,这反过来使它们能够处理非常大的数据集。 基础设施层: 目前&#xff…

可替换STM23G031的32位单片机

灵动微MM32G系列MCU。基于Arm Cortex M0内核,封装型号均引脚兼容业界主流G系列,为用户提供更多的MM32 MCU选择。与MM32F系列相比,MM32G系列对产品的引脚布局进行了全面优化,在保证效率和可靠性的基础上,升级工艺、压缩…

TCP协议二:TCP状态转换(重要)

TCP状态转换分析https://www.bilibili.com/video/BV1iJ411S7UA?p44&spm_id_frompageDriver&vd_sourced239c7cf48aa4f74eccfa736c3122e65 TCP状态转换图 粗实线:主动端 虚线: 被动端 细实线:内核操作 状态分析 CLOSED&#xff1…

指数分布族和广义线性模型

1.指数分布族 1.1 定义 指数族分布 (The exponential family distribution),区别于指数分布(exponential distribution)。 指数分布族不是专指一种分布,而是一系列符合特征的分布的统称。 在概率统计中,若某概率分布满足下式,我们…

2023年第十四届蓝桥杯将至,来看看第十三届蓝桥杯javaB组题目如何

ฅ(๑˙o˙๑)ฅ 大家好, 欢迎大家光临我的博客:面向阿尼亚学习 算法学习笔记系列持续更新中~ 文章目录一、前言二、2022年蓝桥杯javaB组省赛真题目录A:星期计算[5分]思路⭐代码🌟B 山(5分)思路⭐代码🌟C 字符统计(10分)思路⭐代码&#x1f3…

Elasticsearch+Kibana·入门·贰·DSL专题

文章目录1 DSL查询文档1.1 DSL查询分类1.2.全文检索查询1.2.1 使用场景1.2.2.基本语法:match与multi_match1.2.3 示例:match与multi_match1.3.精准查询1.3.1 term查询1.3.2 range查询1.4 地理坐标查询1.4.1 矩形范围查询1.4.2 附近查询1.5.复合查询1.5.1…