【问题标题】:Why my code just writes the last variable?为什么我的代码只写最后一个变量?
【发布时间】:2021-10-13 07:26:50
【问题描述】:

下面的代码应该制作 10 个名称为 1、2、3、...、10 的视频,但它只写最后一个视频,其他视频为 0 kb。我不确定问题出在哪里。代码是可重现的。


import matplotlib.pyplot as plt
import matplotlib
import numpy as np
from cv2 import VideoWriter, VideoWriter_fourcc

pixels = 600
my_dpi = 100
num_geo=10
FPS=1
seconds = 100

load_x = np.random.rand(14,100,3)
coord = np.random.rand(5,2,10)


for i in range(num_geo):
    fourcc = VideoWriter_fourcc(*'MP42')
    video = VideoWriter((str(i) + ".mp4"), fourcc, FPS, (pixels, pixels))
    
for j in range(100):
    fig = plt.figure(num_geo,figsize=( pixels/my_dpi,  pixels/my_dpi),facecolor='k', dpi=my_dpi)  
    plt.axes([0,0,1,1])
    rectangle = plt.Rectangle((-300, -300), 600, 600, fc='k')
    plt.gca().add_patch(rectangle)
    a=load_x[0,j,:].tolist()
    a=matplotlib.colors.to_hex(a)

    plt.plot([coord[0][0][i], coord[4][0][i]], [coord[0][1][i], coord[4][1][i]], color=str(a), lw=8, antialiased=True)
    plt.axis('off')
    plt.axis([-300,300,-300,300])
        
    fig.canvas.draw()
    
    data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
    data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))   
 
    video.write(data)
video.release()

【问题讨论】:

    标签: python for-loop matplotlib video cv2


    【解决方案1】:

    缩进第二个循环和所有后续行。

    编辑:您可能还应该在第二个 for 循环之外拉出一堆不必要的计算。请参阅下面的更新版本:

    for i in range(num_geo):
        fourcc = VideoWriter_fourcc(*'MP42')
        video = VideoWriter((str(i) + ".mp4"), fourcc, FPS, (pixels, pixels))
        fig = plt.figure(num_geo,figsize=( pixels/my_dpi, pixels/my_dpi),facecolor='k', dpi=my_dpi)  
        plt.axes([0,0,1,1])
        for j in range(100):
            rectangle = plt.Rectangle((-300, -300), 600, 600, fc='k')
            plt.gca().add_patch(rectangle)
            a=load_x[0,j,:].tolist()
        a=matplotlib.colors.to_hex(a)
    
        plt.plot([coord[0][0][i], coord[4][0][i]], [coord[0][1][i], coord[4][1][i]], color=str(a), lw=8, antialiased=True)
        plt.axis('off')
        plt.axis([-300,300,-300,300])
                
        fig.canvas.draw()
            
        data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
            data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))   
        
        video.write(data)
        video.release()
    

    【讨论】:

    • 谢谢,它写在所有视频上,但每次迭代后都会覆盖 plt.plot 行。每个视频应该有一条彩线,但第二个视频有 2 条彩线,第三个视频有 3 条彩线,依此类推。
    • 我想知道第一次迭代中plt.plot 行中的变量i 如何在第一次迭代中取 1,在第二次迭代中只取 2 而不是 1 和 2,而在第三次迭代中只取 3,而不是 1 ,2 和 3。
    • 如果您可以投票或接受我的回答,因为我回答了您的原始问题,那就太好了!
    • 变量i每次都通过for循环进行修改。所以它只会采用 0,1,2,...,9 的值。绝不是这些整数的组合。
    • 新编辑的版本可能会解决其他问题,特别是将行 fig = plt.figure(...) 移到最后一个 for 循环之外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2015-07-04
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多