Как избежать системных убийств при объединении кадров в одно видео - PullRequest
1 голос
/ 03 апреля 2020

Я использовал python для объединения 5576 изображений в одно видео со скоростью 30 кадров в секунду.

Я пробовал много кодов, размещенных на inte rnet, но, тем не менее, всегда получаю эту ошибку.

Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
* * *

, который я изучил в операционной системе, убивал мой процесс.

Я использую 64-битную версию ubuntu, pycharm, python3 .8.

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 Ответ

1 голос
/ 03 апреля 2020

На мой взгляд, процесс должен быть сбой в for filename in li:img = cv2.imread(filename). То, что вы пытаетесь сделать здесь, это прочитать изображения 5K, используя cv2.imread(). Давайте предположим, что размер одного изображения составляет 1 МБ в памяти (это отличается от размера диска), тогда описанный выше процесс будет занимать 5 ГБ памяти. В этом сценарии я бы порекомендовал, чтобы вместо чтения всех изображений и их сохранения в 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()
...