Как создать вектор матриц для хранения большого количества изображений?

Я хочу создать вектор матриц, чтобы сохранить как можно больше изображений.

Я знаю, что это возможно, как написано ниже:

vector<Mat> images1;

и во время получения изображения с камеры и я бы сохранить изображения на 100fps с разрешением 1600 * 800, как показано ниже:

images1.push_back(InputImage.clone());

Где InputImageнаходится коврик и дано камерой. Так как создание видео в процессе получения приводит либо к отсутствию кадра в видео, либо к снижению скорости съемки.

Позже после остановки сбора изображений и перед остановкой программы я бы записал изображения в видео, как написано ниже:

VideoWriter writer;
writer = Videowriter("video.avi",-1,100,frameSize(1600,800),false);
for (vector<Mat>::iterator iter = images1.begin(); ier != images1.end(); iter++)
writer.write(*iter);

Это правильно, так как я не уверенimages1, что может хранить изображения около 1500 изображений без переполнения.

2 ответа

  1. Вам действительно не нужно беспокоиться о «переполнении», что бы это ни значило в вашем контексте.

    Самая большая проблема-это память. Одиночный кадр принимает (на 8 битах в цвет, с 3 цветами) 3 * 1600 * 800 == 3.84Mb. При скорости 100 кадров в секунду для съемки требуется 0,384 Гб памяти. 8GB памяти может только держать около 20 секунд отснятого материала. Вам понадобится почти 24 ГБ памяти, прежде чем вы сможете удерживать целую минуту. Существует причина, по которой подавляющее, подавляющее, подавляющее большинство программного обеспечения для кодирования видео только держит несколько кадров видеоданных в памяти в любой момент времени, а остальное сбрасывает на жесткий диск (или отбрасывает его, в зависимости от того, какую цель программное обеспечение служит).

    То, что вы, вероятно, должны делать (то, что делают такие программы, как FRAPS), это сброс кадров на жесткий диск, как только вы их получите. Затем, когда запись завершится, вы можете либо назвать ее днем (если вам нужен необработанный видеоматериал), либо вы можете начать процесс чтения файла и кодирования его в более сжатый формат.

  2. Предварительно выделите вектор изображения в памяти, чтобы просто скопировать кадры без выделения в реальном времени.

    Если у вас есть проблемы с памятью, попробуйте сбросить кадры в файл, ОС, надеюсь, будет в состоянии обрабатывать ввода-вывода, если не попробовать сопоставленные с памятью файлы.