Я работаю с датчиком Kinect и хочу сохранить и загрузить полученные данные. По сути, это дает мне два типа кадров (цвет и глубина), которые я сохраняю в двоичном файле. Поскольку каждый кадр имеет размер чуть более 1 МБ и записи Kinect со скоростью 30 кадров в секунду, файлы имеют тенденцию расти довольно быстро.
Теперь мне нужен эффективный способ загрузки данных и быстрый произвольный доступ к кадрам.
То, как я это сделал сейчас, выглядит так:
Frame
класс, который содержит заголовок кадра (номер кадра, метку времени, тип, размер данных) и указатель на фактические данные изображенияReplay
класс, который содержит заголовок (количество кадров, разрешение и т. д.) и два вектора: frames
который содержит Frame
объекты с указателем данных инициализированы в NULL и framePositions
который сопоставляет номер кадра с его местоположением в файле.
Загрузка выглядит примерно так (сжато):
Replay replay;
Frame frame;
int position = fStream.tellg();
fStream.read((char *) &frame.header, sizeof(frame.header));
fStream.ignore(frame.dataSize); // skip image data for now
replay.insertFrame(frame, pos); // put frame and pos into vectors
Так что это лучше, чем загружать все в память, но все равно медленно. Существует программное обеспечение MS под названием Kinect Studio, которое мгновенно открывает записанные файлы. Буквально в одно мгновение, в то время как мое решение занимает несколько секунд, чтобы загрузить файл аналогичного размера. Что это за колдовство?
Теперь у меня есть следующая идея: создать массив позиций кадров в файле, поместить его в конец файла (так как это будет переменный размер), поместить его смещение и размер в заголовок, даже не беспокойтесь загрузка кадров, просто загрузите массив и запросите кадры, когда это необходимо.
Я думаю, что это может сработать, но я решил обратиться за советом, прежде чем пытаться его реализовать, так как считаю, что существуют стандартные способы решения таких проблем, и я не хочу изобретать велосипед путем проб и ошибок.
Задача ещё не решена.
Других решений пока нет …