如何使用 python、matplotlib 和 opencv 生成视频?
How to generate a video with python, matplotlib and opencv?
这是我现在拥有的。
导入的库:
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np
import cv2
import time
例如(这部分代码来自网络示例),我画了一个带有“文本”的图
fig = plt.figure(figsize=(6,6.5))
canvas = FigureCanvas(fig)
ax = fig.gca()
ax.text(0.0,0.0,"Test", fontsize=45)
ax.axis('off')
然后,我将其保存到“1.png”。
plt.savefig("1.png")
最后,我创建了一个视频编写器并将 png 写入视频。
size = (600,650)
fps = 2
fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0')
video = cv2.VideoWriter("1.avi", fourcc, fps, size)
image = cv2.imread('1.png')
video.write(image)
video.release()
问题来了:我需要把图片保存下来,然后读取成opencv可以读取的numpy数组,有什么办法可以直接把fig对象转成image对象(numpy 数组)?
非常感谢你们!
让我们一步一步来分析:
-
size = (600,650)
图片的大小是600, 650
吗?
如果我是你,我会初始化为
image = cv2.imread('1.png')
(height, width) = image.shape[:2]
size = (width, height)
或者如果您希望输出为 (600, 650)
,则调整图像大小:
image = cv2.imread('1.png')
image = cv2.resize(image, (600, 650))
-
fps = 2
为什么?您将每秒帧数设置为 2,为什么不设置为 10、15? source
-
fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0')
为什么 I420
?你要创建.avi
文件,然后设置为MJPG
source
如果我是你,我会初始化为:
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
-
video = cv2.VideoWriter("1.avi", fourcc, fps, size)
您正在处理什么类型的图像?颜色,灰色?您需要在 VideoWriter
中初始化为参数
对于彩色图像:
video = cv2.VideoWriter("1.avi", fourcc, fps, size, isColor=True)
对于灰色图像:
video = cv2.VideoWriter("1.avi", fourcc, fps, size, isColor=False)
示例代码:
import cv2
img = cv2.imread("1.png")
(h, w) = img.shape[:2]
size = (w, h)
fps = 20
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
video = cv2.VideoWriter("1.avi", fourcc, fps, size, isColor=True)
video.write(img)
video.release()
还知道 cv2.imread
以 BGR
方式读取图像。如果您希望图像为 RGB
,则需要将其转换为:
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
这是我现在拥有的。
导入的库:
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np
import cv2
import time
例如(这部分代码来自网络示例),我画了一个带有“文本”的图
fig = plt.figure(figsize=(6,6.5))
canvas = FigureCanvas(fig)
ax = fig.gca()
ax.text(0.0,0.0,"Test", fontsize=45)
ax.axis('off')
然后,我将其保存到“1.png”。
plt.savefig("1.png")
最后,我创建了一个视频编写器并将 png 写入视频。
size = (600,650)
fps = 2
fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0')
video = cv2.VideoWriter("1.avi", fourcc, fps, size)
image = cv2.imread('1.png')
video.write(image)
video.release()
问题来了:我需要把图片保存下来,然后读取成opencv可以读取的numpy数组,有什么办法可以直接把fig对象转成image对象(numpy 数组)?
非常感谢你们!
让我们一步一步来分析:
-
size = (600,650)
图片的大小是600, 650
吗?
如果我是你,我会初始化为
image = cv2.imread('1.png')
(height, width) = image.shape[:2]
size = (width, height)
或者如果您希望输出为 (600, 650)
,则调整图像大小:
image = cv2.imread('1.png')
image = cv2.resize(image, (600, 650))
-
fps = 2
为什么?您将每秒帧数设置为 2,为什么不设置为 10、15? source
-
fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0')
为什么 I420
?你要创建.avi
文件,然后设置为MJPG
source
如果我是你,我会初始化为:
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
-
video = cv2.VideoWriter("1.avi", fourcc, fps, size)
您正在处理什么类型的图像?颜色,灰色?您需要在 VideoWriter
对于彩色图像:
video = cv2.VideoWriter("1.avi", fourcc, fps, size, isColor=True)
对于灰色图像:
video = cv2.VideoWriter("1.avi", fourcc, fps, size, isColor=False)
示例代码:
import cv2
img = cv2.imread("1.png")
(h, w) = img.shape[:2]
size = (w, h)
fps = 20
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
video = cv2.VideoWriter("1.avi", fourcc, fps, size, isColor=True)
video.write(img)
video.release()
还知道 cv2.imread
以 BGR
方式读取图像。如果您希望图像为 RGB
,则需要将其转换为:
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)