Как пропустить отсутствующие изображения / кадры в последовательности изображений при использовании cv2.videocapture ()? - PullRequest
0 голосов
/ 04 августа 2020

У меня в каталоге хранится около 40К кадров. Я использую следующий код, чтобы прочитать их и, в конечном итоге, записать их в видеофайл. Следующий фрагмент предназначен только для отображения видео.

cap = cv2.VideoCapture('path/to/images/%010d.jpg')
while(True):
    ret, frame = cap.read()
    if (ret == True):
        cv2.imshow('video output', frame)
        cv2.waitKey(30)

Он работает до тех пор, пока в последовательности не будет отсутствующего изображения. в моем случае у меня нет изображения «0000000021.jpg». Таким образом, он возвращает следующую ошибку:

[image2 @ 0x1401500] Could not open file : path/to/images/0000000021.jpg

У меня два вопроса:

  1. Как я могу получить имя отсутствующего изображения / кадра?
  2. Является есть способ указать функции cap.read () просто охладить и увеличить следующую последовательность, например. в моем случае пропустите '0000000021.jpg' и go до '0000000022.jpg' и так далее.

Ура

1 Ответ

0 голосов
/ 04 августа 2020

Я не смог выдать ошибку, поэтому мой ответ может быть неточным.

Но это может дать вам подсказку о том, как ее решить.

Я думаю, что по обоим вопросам вот ответ:

from cv2 import VideoCapture
from cv2 import imshow, waitKey

missing_frames = []

capture = VideoCapture('path/to/images/%010d.jpg')

while True:
    _, frame = capture.read()

    if frame is None:
        missing_frames.append(frame)
    else:
        imshow('out', frame)
        waitKey(0)

Объяснение

Вы читаете последовательность изображений, используя VideoCapture, и в каталоге есть некоторые отсутствующие кадры.

Если кадр отсутствует, ret возвращает False, а frame возвращает None.

ret, frame = capture.read()

Я понимаю, что вы сосредоточены на чтении и записи кадров. Следовательно, вам не нужна переменная ret. Достаточно просто проверить frame.

если frame не доступен в каталоге, добавьте его в список mssing_frames. В противном случае покажите его.

Я пытаюсь высказать свое мнение о том, как вы его решите. Если вы спросите меня, я решаю проблему следующим образом:

from os import getcwd
from os.path import join
from cv2 import imshow
from cv2 import waitKey
from cv2 import imread
from glob import glob


def get_integer(frame_name):
    frame_name = frame_name.replace(path, '')
    frame_name = frame_name.replace('.jpg', '')
    frame_number = int(frame_name[1:])
    return frame_number


if __name__ == '__main__':
    missing_frames = []
    path = join(getcwd(), 'test-case')
    capture = glob(join(path, '*.jpg'))

    name = capture[0]
    name_num = get_integer(name)

    for frame in capture:
        frame_num = get_integer(frame)

        if name_num != frame_num:
            missing_frames.append(frame)

        imshow('out', imread(frame))
        waitKey(0)
        name_num += 1

    print(missing_frames)

Вывод:

['/Users/ahmettavli/PycharmProjects/StackOverFlow/test-case/0000000023.jpg']

Я сохранил все изображения, используя glob, и проверяю, нет ли отсутствующего кадра. по его номеру.

...