Я использую 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-минутные видеоролики. Я хотел бы избежать такого подхода, если это абсолютно невозможно.
Кто-нибудь знает, что может быть причиной этого и / или как я могу решить проблему? Может ли это быть вызвано самим видео? Мне это кажется маловероятным, но, тем не менее, стоит задуматься.
Спасибо,
Джереми