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



