matplotlib 使用动画和位传输在3D绘图中高效地渲染视频

ee7vknir  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(104)

我目前正在做一个可视化任务,我想使用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()
r6l8ljro

r6l8ljro1#

好吧,我从来没有解决过这个问题,但作为一个替代解决方案,我运行ani.save(“test.gif”,fps=23),得到的gif显示了我所期望的。我猜matplotlibs不适合在低帧速率下更新大量数据。

相关问题