cv2.imshow()生成的是一段动画(或者叫视频?动图?),该如何对其进行保存,例如保存为mp4格式
我的意思就是跑了一段代码,结果是动图,又不想录屏,该如何保存到指定位置
该回答引用ChatGPT
import cv2
# 定义视频编码器
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 定义视频写入器,参数分别是文件名、编码器、帧速率、帧大小
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
# 在循环中捕获每一帧,并写入视频文件
while True:
# 在代码中获取每一帧图像
ret, frame = cap.read()
if not ret:
break
# 写入当前帧
out.write(frame)
# 在窗口中显示当前帧
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放视频写入器
out.release()
# 释放摄像头
cap.release()
# 关闭所有窗口
cv2.destroyAllWindows()
您可以使用 OpenCV 库的 VideoWriter 类来将 cv2.imshow() 生成的图像保存为视频,例如 MP4 格式。下面是一个示例:
import cv2
# 创建 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
out = cv2.VideoWriter("output.mp4", fourcc, 20.0, (640,480))
# 循环读取图像,并写入视频
while True:
# 读取图像
frame = cv2.imshow("frame", frame)
# 如果读取的图像为空,则退出循环
if frame is None:
break
# 写入视频
out.write(frame)
# 如果用户按下“q”键,则退出循环
if cv2.waitKey(1) & 0xFF == ord("q"):
break
# 释放资源
out.release()
cv2.destroyAllWindows()
在上面的代码中,首先创建了 VideoWriter 对象,并设置视频的编码方式、帧率、宽高等参数。然后,在循环中读取图像,并写入视频。最后,在结束时,需要释放资源。
有两种方式,一种是录制视频,另一种是保存为动图。
根据你的描述,我认为保存为动图,比保存为视频更好。因为 imshow 播放的实际是一帧一帧的图像,而不是视频——虽然也可以说这就是视频。
参考例程如下,把 imshow 的每一帧图像保存过去就行。
import cv2 as cv
from matplotlib import pyplot as plt
if __name__ == '__main__':
# 读取单幅图像,支持 bmp、jpg、png、tiff 等常用格式
img1 = cv.imread("../images/FVid1.png") # 读取彩色图像 FVid1.png
img2 = cv.imread("../images/FVid2.png") # 读取彩色图像 FVid2.png
img3 = cv.imread("../images/FVid3.png") # 读取彩色图像 FVid3.png
img4 = cv.imread("../images/FVid4.png") # 读取彩色图像 FVid4.png
imgList = [img1, img2, img3, img4] # 生成多帧图像列表
# 保存多帧图像文件
saveFile = "../images/imgList.tiff" # 保存文件的路径
ret = cv.imwritemulti(saveFile, imgList)
if (ret):
print("Image List Write Successed in {}".format(saveFile))
print("len(imgList): ", len(imgList)) # imgList 是列表,只有长度没有形状
# 读取多帧图像文件
imgMulti = cv.imreadmulti("../images/imgList.tiff") # 读取多帧图像文件
print("len(imgList): ", len(imgList)) # imgList 是列表
# 显示多帧图像文件
for i in range(len(imgList)):
print("\timgList[{}]: {}".format(i, imgList[i].shape)) # imgList[i] 是 Numpy 数组
cv.imshow("imgList", imgList[i]) # 在窗口 imgList 逐帧显示
cv.waitKey(1000)
cv.destroyAllWindows()
# 将动画、视频、动图保存为 .avi
video_writer = cv2.VideoWriter('savefile.avi',cv2.VideoWriter_fourcc(*'XVID'), FPS, (W, H))
# 图像逐帧写入
for i in range(frame_num):
video_writer.write(img[i])
# 显示进度
print("\r Writing {} / {}".format(i, frame_num), end='')
# 释放 writer
video_writer.release()
要保存使用 cv2.imshow() 函数生成的动画,您需要编写一个循环来捕获动画的帧,然后将帧写入视频文件。 这是一个代码片段,向您展示了如何执行此操作:
import cv2
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # or 'XVID'
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (640,480))
# Your animation loop
while True:
# Generate the frame
frame = cv2.imshow('frame', frame)
# Write the frame to the video file
out.write(frame)
# Break the loop if the user presses the 'q' key
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Release the VideoWriter object
out.release()
# Close all windows
cv2.destroyAllWindows()
请注意,您需要指定要使用的 FourCC 编解码器,以及帧大小和帧速率。 在此示例中,我们使用 FourCC 编解码器 mp4v 和每秒 20 帧的帧速率,帧大小为 (640, 480)。 您可以根据您的要求更改这些值。
你可以使用 OpenCV 中的 cv2.VideoWriter 类来保存动画或者视频。 你可以在创建该类的实例时,指定文件名、编码器等参数,然后在逐帧处理过程中,使用 write 方法将每一帧写入视频。
下面是一个简单的示例:
import cv2
# 创建 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 指定编码器
width = 640
height = 480
fps = 20
video_writer = cv2.VideoWriter("video.mp4", fourcc, fps, (width, height))
# 构造每一帧
for i in range(100):
frame = cv2.imread("frame_{}.png".format(i)) # 读取图片
video_writer.write(frame)
# 释放 VideoWriter 对象
video_writer.release()
这样就可以得到一个名为 "video.mp4" 的 MP4 格式的视频文件了。
首先,您需要创建一个 VideoWriter 对象,并为其指定一个输出文件名、 FourCC 编码(四字符代码,用于编码视频的格式)和帧率(即每秒的帧数)。接下来,您可以循环处理每一帧,并通过 write() 方法将帧写入 VideoWriter 对象。最后,请确保在结束后使用 release() 方法关闭 VideoWriter 对象。
import cv2
import numpy as np
# 指定输出文件名、编码和帧率
filename = 'video.mp4'
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
fps = 30
# 创建 VideoWriter 对象
video_writer = cv2.VideoWriter(filename, fourcc, fps, (width, height))
# 循环处理每一帧
for i in range(num_frames):
frame = ... # 获取当前帧的数据
video_writer.write(frame)
# 关闭 VideoWriter 对象
video_writer.release()
参考下这个实例讲解思路:http://events.jianshu.io/p/703e5be4538f