我想提个建议:
success = True
frames = []
while success:
不要像上面那样写,而是写成:
frames = []
while vidcap.isOpened():
上面的代码很有意义。如果视频已打开,则处理其帧。
我的第二个建议是:
frames.append(image)
success,image = vidcap.read()
count += 1
首先检查是否返回frame,然后追加到列表中。
while vid_cap.isOpened():
success, image = vid_cap.read()
if success:
frames.append(image)
count += 1
您将VideWriter 初始化为:
writer = cv2.VideoWriter("outputvideo.mp4", cv2.VideoWriter_fourcc(*"MP4V"), 30, (512, 512))
有两个约束:
1- 每帧必须为 (512, 512) 大小
2-而且每一帧都必须是rgb。
如果你想要灰度视频,你需要将isColor变量设置为False
writer = cv2.VideoWriter("outputvideo.mp4", cv2.VideoWriter_fourcc(*"MP4V"), 30, (512, 512), isColor=False)
既然你想要每个帧大小(512, 512),你可以这样做:img = cv2.resize(image, (512, 512))
while vid_cap.isOpened():
success, image = vid_cap.read()
if success:
img = cv2.resize(image, (512, 512))
frames.append(img)
count += 1
else:
break
现在,Expected Ptr<cv::UMat> for argument 'src' 的意思是 writer.write 第一个参数 image 应该是一个框架,但您提供了一个列表输入。因此:
1- 初始化VideoWriter 对象
2- 使用“mp4v”代替“MP4V”,否则您可能会收到警告
2- 使用 for-loop 写入帧
writer = cv2.VideoWriter("outputvideo.mp4", cv2.VideoWriter_fourcc(*"mp4v"), 30, (512, 512))
for i in range(0, len(frames), 100):
newframes.append(frames[i])
writer.write(frames[i])
writer.release()
代码:
import cv2
vid_cap = cv2.VideoCapture("result.mp4")
# store every frame from video file
success, image = vid_cap.read()
count = 0
frames = []
while vid_cap.isOpened():
success, image = vid_cap.read()
if success:
img = cv2.resize(image, (512, 512))
frames.append(img)
count += 1
else:
break
vid_cap.release()
newframes = []
writer = cv2.VideoWriter("outputvideo.mp4", cv2.VideoWriter_fourcc(*"mp4v"), 30, (512, 512))
for i in range(0, len(frames), 100):
newframes.append(frames[i])
writer.write(frames[i]) # write frame into output vid
writer.release()