背景
由于作业需要,尝试了图片与视频的相互转化,奈何看到很多文章尝试后总会出点问题,因此这里一并记录解决
不过目前图片转视频后仍然存在闪烁问题,但看到较好的解决方法后再更新
视频转图片
详见注释
import cv2
def getpic(videoPath, svPath):#两个参数,视频源地址和图片保存地址
cap = cv2.VideoCapture(videoPath)
numFrame = 0
while True:
# 函数cv2.VideoCapture.grab()用来指向下一帧,其语法格式为:
# 如果该函数成功指向下一帧,则返回值retval为True
if cap.grab():
# 函数cv2.VideoCapture.retrieve()用来解码,并返回函数cv2.VideoCapture.grab()捕获的视频帧。该函数的语法格式为:
# retval, image = cv2.VideoCapture.retrieve()image为返回的视频帧,如果未成功,则返回一个空图像。retval为布尔类型,若未成功,返回False;否则返回True
flag, frame = cap.retrieve()
if not flag:
continue
else:
numFrame += 1
#设置图片存储路径
newPath = svPath + str(numFrame) + ".jpg"
# cv2.imencode()函数是将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输。
cv2.imencode('.jpg', frame)[1].tofile(newPath)
print(numFrame)
else:
break
getpic("test.mp4", "G:/zanshipic/")
print("all is ok")
图片转视频
详见注释
import cv2
import os
# 其它格式的图片也可以
img_array = []
path = "G:/zanshipic/" # 图片文件路径
filelist = os.listdir(path) # 获取该目录下的所有文件名
for filename in filelist:
#挨个读取图片
img = cv2.imread(path+filename)
#获取图片高,宽,通道数信息
height, width, layers = img.shape
#设置尺寸
size = (width, height)
#将图片添加到一个大“数组中”
img_array.append(img)
print("this is ok")
# avi:视频类型,mp4也可以
# cv2.VideoWriter_fourcc(*'DIVX'):编码格式,不同的编码格式有不同的视频存储类型
# fps:视频帧率
# size:视频中图片大小
fps=30
videopath='G:/test10.avi'#图片保存地址及格式
out1 = cv2.VideoWriter(videopath,cv2.VideoWriter_fourcc(*'DIVX'),fps, size)
for i in range(len(img_array)):
#写成视频操作
out1.write(img_array[i])
out1.release()
print("all is ok")