1. 视频转图片
import cv2
import math
cap = cv2.VideoCapture('video/MOV_0005.MOV') #加载视频文件
cap_num = cap.get(7) # 获取视频总帧数
cap_width = math.ceil(cap.get(3)) #获取视频帧宽度(横)
cap_height = math.ceil(cap.get(4)) #获取视频帧高度(竖)
cap_fps = math.ceil(cap.get(5)) #获取视频帧率
#得到视频总帧数的位数,比如198帧(三位数),得到3;1989帧(4位数),得到4
cap_count = 0
while cap_num:
cap_count = cap_count+1
cap_num = math.floor(cap_num/10)
fix = '%0'+str(cap_count)+'d' #得到图片保存的前缀,比如001.png,0001.png
cap_cnt = 1
flag, frame = cap.read() #读取图片
while flag:
path = 'video/img_sequ/'+str(fix%cap_cnt)+'.png' #图片保存目录
cv2.imwrite(path,frame)
cap_cnt = cap_cnt+1
flag, frame = cap.read()
cap.release()
2. 图片转视频
import cv2
#保存为avi视频格式,超占内存,每张图片4M,1000张,完完整整的3.5G
fourcc = cv2.VideoWriter_fourcc('I','4','2','0') #视频的格式
#cap_fps是帧率,可以根据随意设置;size要和图片的size一样,但是通过img.shape得到图像的
(height,width,channel),但是此处的size要传的是(width,height),这里一定要注意注意,
不然结果会打不开,提示“无法解码多工传送的流”等.比如通过img.shape得到常用的图片尺寸(1080,1920,3),则size设为(1920,1080)
cap_fps = 30
size = (1920, 1080) #根据自己图片尺寸更改
video = cv2.VideoWriter('results/result.avi',fourcc, cap_fps, size)
#video.write默认保存彩色图,如果是灰度图,则
img_E = cv2.imread('test/0001.png')
img_E = cv2.merge((img_E,img_E,img_E)) #拓展为三通道
video.write(img_E)
#默video.write默认保存彩色图,如果是彩色图,则直接保存
img_E = cv2.imread('test/0001.png')
video.write(img_E)
video.release()
#保存为mp4视频格式,省内存,每张图片4M,1000张,完完整整的才17M大小
fourcc = cv2.VideoWriter_fourcc('m','p','4','v') #视频的格式
cap_fps = 30
size = (cap_width, cap_height)
video = cv2.VideoWriter('results/result.mp4',fourcc, cap_fps, size)
#video.write默认保存彩色图,如果是灰度图,则
img_E = cv2.imread('test/0001.png')
img_E = cv2.merge((img_E,img_E,img_E)) #拓展为三通道
video.write(img_E)
#默video.write默认保存彩色图,如果是彩色图,则直接保存
img_E = cv2.imread('test/0001.png')
video.write(img_E)
video.release()
附录---备用
#如果要转换图像通道
img = img[...,[2,1,0]]
#将现成的大内存avi转换为小内存的mp4文件
from subprocess import call
command = 'ffmpeg -i results/result.avi results/result.mp4'
call(command.split())