OpenCV. Почему отдельные кадры из видео весят больше чем видео?

Что я делаю:
Беру видео, беру некоторые его кадры, из каждого из них вырезаю область
1. Сохраняю в новое видео
2. Сохраняю в памяти
Сохраненное видео весит ~80 килобайт, сохраненные в оперативной памяти области весят ~260 мегабайт.
Почему такая разница?
Хочу чтобы эти области были в оперативной памяти как изображения, чтобы их использовать, но в данный момент они как Numpy массив.
Код
for frame in objects_frame_position:
    video.set(cv2.CAP_PROP_POS_FRAMES, frame)
    ret, video_frame = video.read()
    if ret:
        object_frame_info = objects_frame_position[frame]
        position: Position = object_frame_info['Position']
        object_border = video_frame[position.y:position.y+position.height, position.x:position.x+position.width]
        objects_images[object_id].append(object_border)

Может можно как-то конвертировать их в изображения, чтобы они не занимали столько памяти?
  • Вопрос задан
  • 100 просмотров
Решения вопроса 2
trapwalker
@trapwalker
Программист, энтузиаст
Потому что кадры в массивах хранятся в несжатом виде, а исходный видео-ролик сжат кодеком.
Кодеки сейчас довольно сложные, у них много параметров сжатия и нетривиальные алгоритмы. Вы один и тот же ролик можете расжать и сжать по новой, а в результате получите совсем другой объём и даже немного отличающийся контент, ведь сжатие происходит обычно с потерей качества.
Ответ написан
Комментировать
@wintreist Автор вопроса
Решил проблему, как и предположил, необходимо было конвертировать в изображения в оперативной памяти:
for frame in objects_frame_position:
        video.set(cv2.CAP_PROP_POS_FRAMES, frame)
        ret, video_frame = video.read()
        if ret:
            object_frame_info = objects_frame_position[frame]
            position: Position = object_frame_info['Position']
            object_border = video_frame[position.y:position.y +
                                        position.height, position.x:position.x+position.width]
            _, buffer = cv2.imencode('.jpg', object_border)
            io_buffer = io.BytesIO(buffer)
            objects_images[object_id].append(io_buffer)

Использовал этот ответ
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы