cv2 cap.set () значительное увеличение времени выполнения после 20 минут видео - PullRequest
0 голосов
/ 06 июня 2019

Я использую cv2 для получения кадров из видео продолжительностью ~ час. Использование cap.set(cv2.CAP_PROP_POS_FRAMES, frame_counter - 1) работает, как ожидалось, примерно до 20 минут в моем видео, после чего требуется несколько секунд для запуска, что непозволительно долго для моей программы. Вот мой код:

frame_counter = 1

cap_set_time = 0
count_inc = 150

cap = cv2.VideoCapture("<video fname>.MPG")

while cap.isOpened():

    cap_read_time_start_t = time.time()
    ret, frame = cap.read()
    cap_read_time = time.time() - cap_read_time_start_t

    print("for frame #:",frame_counter,"\t\t seconds per capset time :",str(round( cap_set_time, 7)),"\t\t seconds per cap.read time: " + str(round( cap_read_time, 7)))

    frame_counter += count_inc

    cap_set_start_t = time.time()
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_counter - 1)
    cap_set_time = time.time() - cap_set_start_t

    if not ret:
        cap.release()
        break

Выборочная продукция:

frame #: 1, секунд на время capset: 0 секунд на cap.read время: 0.0049469

frame #: 151, секунд на время capset: 0.0368052 секунд на cap.read время: 0.001281

frame #: 301, секунд на время capset: 0.070514 секунд на cap.read time: 0.000824

кадр №: 451, секунд на капсулу: 0,077548 секунд на капсулу. Время чтения: 0,000912

...

кадр #: 13201, секунд на капсулу: 0,0851121 секунд на капсулу. Время чтения: 0,000891 кадр №: 13351, секунд на капсулу: 0,134234 секунд на капсулу. время чтения: 0,0011251 кадр №: 13501, секунд на капсулу: 0,11519 секунд на капсулу. время чтения: 0,000993

...

для кадра #: 51001 секунды на время capset: 4.2120111 секунд на cap.read время: 0.0009148 для кадра №: 51151 секунда на капсулу: 4,1116858 секунды на капсулу. время чтения: 0,0008929 для кадра №: 51301 секунда на капсулу: 4,1339762 секунды на капсулу. время чтения: 0,0010149

...

для кадра №: 65251 секунда за интервал времени: 8,9148369 секунд время чтения: 0,0011823 для кадра: 65401 секунда на капсулу время: 9,618139 секунд на колпачок. время чтения: 0,0008669 для кадра №: 65551 секунда на капсулу: 9,1504071 секунда на капсулу. Время чтения: 0,0008261

Для ясности, capset time - это время, которое требуется для вызова cap.set(cv2.CAP_PROP_POS_FRAMES, frame_counter - 1), а cap.read time - это время для вызова ret, frame = cap.read(). Обратите внимание, как capset time изначально увеличивается с 0,036 с до ~ 4 секунд на 50 000 кадров в секунду. Эта проблема под рукой .

Я пытался создать экземпляр объекта VideoCapture () до того, как произойдет замедление, но это не сработало. Я искал в Интернете и не видел этой проблемы в других местах.

Стоит отметить, что одним из решений является разбиение видео на 20-минутные видеоролики. Я хотел бы избежать такого подхода, если это абсолютно невозможно.

Кто-нибудь знает, что может быть причиной этого и / или как я могу решить проблему? Может ли это быть вызвано самим видео? Мне это кажется маловероятным, но, тем не менее, стоит задуматься.

Спасибо, Джереми

...