Я хотел бы записывать кадры с камеры в C ++. Частота кадров камеры не постоянна, и мне нужно хранить каждое изображение с его отметкой времени (я использую часы ОС и сохраняю точность изображения в миллисекундах). Я уже сохранил захваченные изображения как последовательность файлов изображений, но изображения, сохраненные независимо (как .png), слишком тяжелые (потому что я работаю с длинными последовательностями, а их много). Итак, я хотел бы воспользоваться сходством между последовательными изображениями (в качестве методов сжатия видео) и создать видео без потерь, которое использует этот факт. Затем я хотел бы использовать это видео для извлечения изображений по отдельности, сохраняя метку времени.
Другими словами, я использую только видеоформат для сжатия последовательности изображений (без потери информации), но мне нужно отслеживать точную метку времени, когда изображения были захвачены.
Итак, мой вопрос:
Как я могу записать потоковое видео с камеры, используя точную метку времени каждого кадра в формате без потерь?
Я пытался с библиотекой OpenCV, в частности с VideoWriter учебный класс. Однако интерфейс VideoWriter не предоставляет какого-либо метода, который принимает кадр и метку времени в качестве входных данных.
Другой вариант, который у меня есть, — хранить вместе с записанным видео метку времени каждого кадра в отдельном текстовом файле. Затем я мог бы использовать метку времени, чтобы извлечь кадры из видео. Однако я не уверен, что получу точный кадр, это без какой-либо информационной интерполяции.
заранее спасибо
Формат должен быть переносимым?
Если нет, вот идея: чередуйте пиксели из набора картинок (число может меняться со временем в зависимости от того, насколько велики изменения).
Итак, фрагмент с N картинками в вашем файле будет содержать:
N: the number of pictures in the chunk
timestamp 1: from picture 1
timestamp 2: from picture 2
...
timestamp N: from picture N
pixel 1: from picture 1, pixel 0,0
pixel 2: from picture 2, pixel 0,0
...
pixel N: from picture N, pixel 0,0
pixel N+1: from picture 1, pixel 0,1
pixel N+2: from picture 2, pixel 0,1
...
pixel N*X*Y: from picture N, pixel X-1,Y-1
Затем используйте библиотеку сжатия без потерь для сжатия фрагмента (теперь содержащего 3D-изображение) и переходите к следующему фрагменту.
Возможно, уже есть вейвлет / фтф библиотеки, способные на что-то подобное.
Других решений пока нет …