首页 > 解决方案 > 这段代码是否有理由随着时间的推移呈指数级减慢,有没有办法解决它?

问题描述

随着时间的推移,这个程序开始运行得越来越慢,以至于它实际上无法使用。

我尝试删除循环中使用的变量,使用 cap.release() 释放我与 cv2 一起使用的视频,并附加到列表而不是使用 np.append() 函数。

def video_generator(name_of_video, video, cap, number_of_frames):
    check, frame = cap.read()

    A = []
    a = []

    if cap.isOpened():
        width = int(cap.get(3))
        height = int(cap.get(4))

    dims = (height, width)

    while cap.isOpened():
        check, frame = cap.read()

        if check:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY).flatten()
            A.append(gray)
            a.append('row')
        else:
            break   

    Data = np.array(A)
    B = np.resize(Data, (number_of_frames, width * height))

    U, S, V = decomposition.randomized_svd(B, 2)
    background = U @ np.diag(S) @ V

    foreground = ([])

    def generate_frames(B, background):
        for i in range(number_of_frames):
            foreground = np.reshape(B[i] - background[i], dims)
            frame = plt.imshow(foreground, cmap = 'gray')
            plt.savefig('D:/Python_Programs/BR_SVD/Frames/' + name_of_video + '/file_' + str(i + x * number_of_frames).zfill(2) + '.png')   

            del frame
            del foreground
            gc.collect()

    generate_frames(B, background)  

    del B
    del background
    gc.collect()

    cap.release()

if number_of_frames_initial <= 200:
    cap = cv2.VideoCapture(video)
    video_generator(name_of_video, video_initial, cap_initial, number_of_frames_initial)

else:
    number_of_videos = int(number_of_frames_initial/200 + 1)
    time_of_videos = duration/number_of_videos

    for x in range (number_of_videos):

        subprocess.call ([
            'ffmpeg', '-i', video_initial, '-ss', str(time_of_videos * x), '-t', str(time_of_videos), 'D:/Python_Programs/BR_SVD/Temp_Videos/video_%02d.mp4' % x])

        video = 'D:/Python_Programs/BR_SVD/Temp_Videos/video_%02d.mp4' % x
        cap = cv2.VideoCapture(video)
        number_of_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
        video_generator(name_of_video, video, cap, number_of_frames)

此代码接收一个视频,然后输出原始视频前景的黑白视频。

标签: pythonperformanceopencv

解决方案


推荐阅读