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

编程入门 行业动态 更新时间:2024-10-24 20:21:02

【Python入门教程】基于OpenCV<a href=https://www.elefans.com/category/jswz/34/1771437.html style=视频分解成图片+图片组合成视频(视频抽帧组帧)"/>

【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视频分解成图片+图片组合成视频(视频抽帧组帧)

本文发布于:2023-12-03 08:23:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1653177.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:视频   组合   图片   分解   入门教程

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!