cv2.inshow动态结果保存

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