将帧合并为一个视频时如何避免系统死机

时间:2020-04-03 04:45:50

标签: python python-3.x opencv image-processing video

我使用python将5576张图像组合成30帧/秒的视频。

我尝试了许多在互联网上发布的代码,但是我总是收到此错误。

Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
我查看操作系统的

正在杀死我的进程。

我正在使用ubuntu,pycharm,python3.8 64位。

import time
import cv2
import numpy as np
import glob
import re


#Natural key for natural sort
def atoi(text):
    return int(text) if text.isdigit() else text

def natural_keys(text):
    return [ atoi(c) for c in re.split(r'(\d+)', text) ]

li = []
for filename in glob.glob('det/*.jpg'):
    li.append(filename)

li.sort(key=natural_keys)

img_array = []
for filename in li:
    img = cv2.imread(filename)
    height, width, layers = img.shape
    size = (width, height)
    img_array.append(img)
    time.sleep(0.1)
    print(f"Frame #{filename}")

out = cv2.VideoWriter('Video/label_vid.avi', cv2.VideoWriter_fourcc(*'DIVX'), 30, size)

for i in range(len(img_array)):
    out.write(img_array[i])
out.release()

1 个答案:

答案 0 :(得分:2)

我认为,该过程必须在for filename in li:img = cv2.imread(filename)中崩溃。您在此处尝试使用cv2.imread()读取5K图像。假设单个映像的大小在内存中为1MB(这与磁盘大小不同),那么上述过程将占用5GB的内存。在这种情况下,我建议您不要读取所有图像并将其存储在img_array.append(img)中,而应将帧直接编码为视频流,如下:

out = cv2.VideoWriter('Video/label_vid.avi', cv2.VideoWriter_fourcc(*'DIVX'), 30, size)

for filename in li:
    img = cv2.imread(filename)
    out.write(img)
out.release()