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

这篇具有很好参考价值的文章主要介绍了【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)
            break
        if 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_index
            cv2.imwrite(save_path, frame)
            image_index += 1
        count += 1
    video.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 cv2


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)
            break
        if 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_index
            cv2.imwrite(save_path, frame)
            image_index += 1
        count += 1
    video.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])).size
    fourcc = 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 Image


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])).size
    fourcc = 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方面的问题,欢迎大家留言交流。我们一起学习进步!文章来源地址https://www.toymoban.com/news/detail-759256.html

到了这里,关于【Python入门教程】基于OpenCV视频分解成图片+图片组合成视频(视频抽帧组帧)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机视觉—python 】 图像处理入门教程 —— 图像属性、像素编辑、创建与复制、裁剪与拼接【 openCV 学习笔记 005 to 010 and 255】

    OpenCV中读取图像文件后的数据结构符合Numpy的ndarray多维数组结构,因此 ndarray 数组的属性和操作方法可用于图像处理的一些操作。数据结构如下图所示: img.ndim:查看代表图像的维度。彩色图像的维数为3,灰度图像的维度为2。 img.shape:查看图像的形状,代表矩阵的行数(高

    2024年01月19日
    浏览(69)
  • 【Python入门教程】CV2报错:cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\s

             OpenCV作为一个强大计算机视觉库被各个领域广泛应用,今天分享下自己编程遇到的报错信息以及解决办法。         这里包含了一个警告和一个报错信息。          警告信息: OpenCV库在处理TIFF图像时遇到的问题有关。从警告信息来看,你的TIFF图像可能使

    2024年02月08日
    浏览(52)
  • 视频教程 | 长安链推出系列视频教程合集(入门)

    区块链技术脱离数字货币实现产业化应用的时间还相对短,处于逐步融入产业化发展的初期;同时区块链技术涉及到密码学、存储、网络、共识算法等多个领域,是一门跨学科、复合型的技术。“新”和“复合”使得部分开发者,尤其是刚开始面对数字化转型的行业开发者对

    2023年04月17日
    浏览(68)
  • OpenCV 入门教程:颜色空间转换

    2023年07月12日
    浏览(54)
  • C++ opencv操作入门教程

    OpenCV是一个功能强大的计算机视觉库,广泛应用于图像和视频处理领域。它提供了许多图像和视频处理的函数和工具,包括加载、保存、缩放、旋转、裁剪、滤波、特征检测、跟踪、分割等等。本文将介绍一些常见的OpenCV函数及其作用,适合初学者入门。 cv::Mat:代表一个n维

    2024年02月16日
    浏览(44)
  • OpenCV 入门教程:全局阈值处理

    全局阈值处理是图像处理中常用的技术之一,用于将图像转换为二值图像,从而提取感兴趣的目标区域。在 OpenCV 中,全局阈值处理可以通过简单的像素比较来实现。本文将以全局阈值处理为中心,为你介绍使用 OpenCV 进行二值图像处理的基本步骤和实例。 😃😄 ❤️ ❤️

    2024年02月13日
    浏览(49)
  • OpenCV 入门教程:图像读取和显示

    2023年07月08日
    浏览(59)
  • OpenCV 入门教程:寻找和绘制轮廓

    寻找和绘制轮廓是图像处理中常用的技术之一,用于识别、定位和分析图像中的目标区域。在 OpenCV 中,寻找和绘制轮廓可以通过边缘检测和形态学操作实现。本文将以寻找和绘制轮廓为中心,为你介绍使用 OpenCV 进行轮廓处理的基本步骤和实例。 😃#x

    2024年02月14日
    浏览(45)
  • OpenCV 入门教程:膨胀和腐蚀操作

    膨胀和腐蚀是图像处理中常用的形态学操作,用于改变图像的形状和结构。在 OpenCV 中,膨胀和腐蚀是基于结构元素的像素操作,可以用于图像增强、边缘检测、图像分割等多个领域。本文将以膨胀和腐蚀操作为中心,为你介绍使用 OpenCV 进行形态学操作的基本步骤和实例。

    2024年02月13日
    浏览(44)
  • OpenCV 入门教程:像素访问和修改

    在图像处理和计算机视觉领域,像素级操作是非常重要和常见的任务之一。通过像素访问和修改,我们可以直接操作图像的像素值,实现各种图像处理和分析操作。在本文中,我们将以像素访问和修改为中心,为你介绍使用 OpenCV 进行像素级操作的基本步骤和实例。 😃😄 ❤

    2024年02月13日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包