我目前正在做一个可视化任务,我想使用matplotlib动画类在3D图中显示一个视频。目的是可视化图像中的特征跟踪。
我有一个工作视频播放反复重绘的数字,但它的工作非常缓慢(约1 fps),我想使它更有效,因为我会添加更多的图纸的数字后。
我尝试使用blitting,它应该只绘制已经改变的数据。我在动画类中设置blit=True并复制官方文档中所做的事情,但视频似乎根本没有播放。它显示任何图像的唯一时间是当我调整窗口大小时,似乎迫使窗口更新。
为什么它不工作?我是否正在寻找正确的方法来实现它?是否有比matplotlib更合适的其他库?
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D
import cv2 as cv
frames = []
for i in range(100):
image = np.random.randint(0,255, size=(260,346), dtype="uint8")
frames.append(image)
W, H = 260,346
X = np.arange(0, W)
Y = np.arange(0, H)
X, Y = np.meshgrid(X, Y)
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(0, X, Y, cstride=1, rstride=1,
linewidth=1, shade=False, edgecolor='none')
clen = (W - 1) * (H - 1)
def init():
# formatting
ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax),
np.diag([1.2, 0.8, 0.8 *
float(H) / float(W), 1]))
ax.view_init(elev=20)
ax.invert_zaxis()
ax.get_xaxis().set_visible(False)
ax.xaxis.labelpad = 20
ax.get_yaxis().set_visible(False)
ax.zaxis.set_major_locator(plt.NullLocator())
ax.yaxis.set_major_locator(plt.NullLocator())
ax.set_xlabel("Time [s]", fontsize=15)
ax.set_xlim([0, 0.5])
ax.set_ylim([0, W - 1])
ax.set_zlim([H - 1, 0])
return surf,
def update(image):
print("Updated...")
img = cv.cvtColor(image, cv.COLOR_GRAY2RGB) / 255
surf.set_facecolor(img[:-1, :-1].reshape(clen, 3))
return surf,
#Create the Animation object
ani = animation.FuncAnimation(fig, update, frames, init_func = init,
interval=500, blit=True)
plt.show()
1条答案
按热度按时间r6l8ljro1#
好吧,我从来没有解决过这个问题,但作为一个替代解决方案,我运行ani.save(“test.gif”,fps=23),得到的gif显示了我所期望的。我猜matplotlibs不适合在低帧速率下更新大量数据。