栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Opencv将一个文件夹下所有图片合成视频

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Opencv将一个文件夹下所有图片合成视频

写在前面:

        最近在学习OpenCv播放视频,学习完毕后,神奇的发现:其实播放视频就是把视频中的图像一帧帧的抽取出来,按照一定的时间间隔展示罢了。

        既然如此,那么我能不能逆向思维——倒过来?把一帧帧图片按照一定时间间隔轮流播放变成视频呢? 抱着这样的办法, 我尝试了实验,最后发现真的可以做得到,而且OpenCv也封装了这个函数,就是使用中有非常多的坑,但是我也一一填补,以下代码函数可以即拿即用!

总览:
# -*- coding: UTF-8 -*-
import os
import cv2
import time

class BatchRename():

    def __init__(self, goal_path, goal_label):
        self.path = goal_path  # 目标图片列表路径
        self.label = goal_label

    def format_path(self):
        self.path = self.path.replace("\", '//')

    def rename(self):
        fileList = os.listdir(self.path)
        # fileList.sort()
        total_num = len(fileList)
        i = 0
        for item in fileList:
             endN = "." + item.split('.')[-2]

             src = os.path.join(self.path, item)
             dst = os.path.join(os.path.abspath(self.path), self.label + str(i) + endN)

             try:
                os.rename(src, dst)
                print('converting %s to %s ...' % (src, dst))
                i += 1
             except Exception as e:
                print(e)
                print("rename dir fallr")
        print('total %d to rename & converted %d jpgs' % (total_num, i))

# 图片合成视频
def picvideo(img_path, size):
    filelist = os.listdir(img_path)  # 获取该目录下的所有文件名
    '''
    fps:
    帧率:1秒钟有n张图片写进去[控制一张图片停留5秒钟,那就是帧率为1,重复播放这张图片5次] 
    如果文件夹下有50张 534*300的图片,这里设置1秒钟播放5张,那么这个视频的时长就是10秒
    '''
    fps = 15
    video_path = os.path.join('Package\video', img_path.split('\')[-1] + ".avi")  # 导出路径
    # 可以用(*'DVIX')或(*'X264'),如果都不行先装ffmepg
    fourcc = cv2.VideoWriter_fourcc('I','4','2','0')  # 不同视频编码对应不同视频格式(例:'I','4','2','0' 对应avi格式)
    video = cv2.VideoWriter(video_path, fourcc, fps, size, True)

    for i in range(len(filelist)):
        item = os.path.join(img_path, str(i)+'.png')
        img = cv2.imread(item)  # 使用opencv读取图像,直接返回numpy.ndarray 对象,通道顺序为BGR ,注意是BGR,通道值默认范围0-255。
        video.write(img)  # 把图片写进视频

    video.release()  # 释放
    print('video_path:', video_path)
    return video_path

def main(img_path):

    img_list = os.listdir(img_path)

    img = cv2.imread(os.path.join(img_path, img_list[7]))
    w, h, _ = img.shape
    return picvideo(img_path, (h, w))  # 尺寸要调转,挖槽,坑死他爹地我了

if __name__ == '__main__':
    main('PackageOrigrial\tds_nm_01')
实现代码: 
# -*- coding: UTF-8 -*-
import os
import cv2
import time

class BatchRename():

    def __init__(self, goal_path, goal_label):
        self.path = goal_path  # 目标图片列表路径
        self.label = goal_label

    def format_path(self):
        self.path = self.path.replace("\", '//')

    def rename(self):
        fileList = os.listdir(self.path)
        # fileList.sort()
        total_num = len(fileList)
        i = 0
        for item in fileList:
             endN = "." + item.split('.')[-2]

             src = os.path.join(self.path, item)
             dst = os.path.join(os.path.abspath(self.path), self.label + str(i) + endN)

             try:
                os.rename(src, dst)
                print('converting %s to %s ...' % (src, dst))
                i += 1
             except Exception as e:
                print(e)
                print("rename dir fallr")
        print('total %d to rename & converted %d jpgs' % (total_num, i))

# 图片合成视频
def picvideo(img_path, size):
    filelist = os.listdir(img_path)  # 获取该目录下的所有文件名
    '''
    fps:
    帧率:1秒钟有n张图片写进去[控制一张图片停留5秒钟,那就是帧率为1,重复播放这张图片5次] 
    如果文件夹下有50张 534*300的图片,这里设置1秒钟播放5张,那么这个视频的时长就是10秒
    '''
    fps = 15
    video_path = os.path.join('Package\video', img_path.split('\')[-1] + ".avi")  # 导出路径
    # 可以用(*'DVIX')或(*'X264'),如果都不行先装ffmepg
    fourcc = cv2.VideoWriter_fourcc('I','4','2','0')  # 不同视频编码对应不同视频格式(例:'I','4','2','0' 对应avi格式)
    video = cv2.VideoWriter(video_path, fourcc, fps, size, True)

    for i in range(len(filelist)):
        item = os.path.join(img_path, str(i)+'.png')
        img = cv2.imread(item)  # 使用opencv读取图像,直接返回numpy.ndarray 对象,通道顺序为BGR ,注意是BGR,通道值默认范围0-255。
        video.write(img)  # 把图片写进视频

    video.release()  # 释放
    print('video_path:', video_path)
    return video_path

def main(img_path):

    img_list = os.listdir(img_path)

    img = cv2.imread(os.path.join(img_path, img_list[7]))
    w, h, _ = img.shape
    return picvideo(img_path, (h, w))  # 尺寸要调转,挖槽,坑死他爹地我了

if __name__ == '__main__':
    main('PackageOrigrial\tds_nm_01')

凑字数尾声:

          Opencv的学习之路漫漫,希望我们能一起加油,共同进步!最后的最后,如果这篇文章有帮助到大家,麻烦点赞+收藏一下喔!

          Opencv的学习之路漫漫,希望我们能一起加油,共同进步!最后的最后,如果这篇文章有帮助到大家,麻烦点赞+收藏一下喔! 

        Opencv的学习之路漫漫,希望我们能一起加油,共同进步!最后的最后,如果这篇文章有帮助到大家,麻烦点赞+收藏一下喔!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022105.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号