Как записывать видео с точной меткой времени кадров в c++

Я хочу записывать кадры с камеры на C++. Частота кадров камеры не является постоянной, и мне нужно сохранять каждое изображение с его меткой времени (я использую часы ОС и сохраняю точность изображения в миллисекундах). Я уже сохранил захваченные изображения как последовательность файлов изображений, но изображения, хранящиеся независимо (как .png), слишком тяжелые (потому что я работаю с длинными последовательностями, а их много). Итак, я хотел бы воспользоваться преимуществом сходства между последовательными изображениями (как методами сжатия видео) и создать видео без потерь, которое использует этот факт. Затем я хотел бы использовать это видео для извлечения изображений по отдельности с сохранением метки времени.

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

Итак, мой вопрос: Как я могу записать потоковое видео с камеры в видео, используя точную временную метку каждого кадра в формате без потерь?

Я пробовал использовать библиотеку OpenCV, в частности, класс VideoWriter. Однако интерфейс VideoWriter не предоставляет никакого метода, который принимает в качестве входных данных кадр и временную метку.

Другой вариант, который у меня есть, - хранить вместе с записанным видео метку времени каждого кадра в отдельном файле txt. Затем я мог бы использовать метку времени для извлечения кадров из видео. Однако я не уверен, смогу ли я получить точный кадр, это без какой-либо интерполяции информации.

заранее спасибо

Я хочу сохранить точную временную метку каждого кадра в видео, а не только настройки сжатия видео. Я устанавливаю метку времени с часами ОС.

taihu 31.10.2018 16:07

У меня в основном такой же запрос функции, как и у вас. Я все еще не уверен, какая библиотека может это сделать.

ollydbg23 20.04.2021 05:19
2
3
608
1

Ответы 1

Должен ли формат быть переносимым?

Если нет, то вот идея: чередуйте пиксели из группы изображений (количество может меняться со временем в зависимости от того, насколько велики изменения).

Итак, блок с 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

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

Возможно, уже существуют библиотеки wavelet / fft, способные на нечто подобное.

Это больше похоже на метод постобработки. Я хотел бы создать видео, как только появится новый кадр. Здесь важно не сжатие, важно сохранить в видео точную временную метку. В этом случае метка времени предоставляется ОС.

taihu 31.10.2018 15:58

В таком случае, разве не будет достаточно сжатия на уровне файловой системы?

Ted Lyngmo 31.10.2018 17:17

нет, потому что мне нужно делать это на лету. Один из вариантов, который у меня есть, - это слишком записывать кадры как видео и сохранять в отдельном текстовом файле метку времени для каждого сохраненного кадра в видео, но мне этот вариант не очень нравится.

taihu 01.11.2018 14:39

Если вы используете сжатие файловой системы, каждый кадр будет сжат и сохранен (с его меткой времени) на лету. Если вам нужно лучшее сжатие, используйте компрессор 2D-изображений без потерь. Если это не сжимает достаточно, вам понадобится кусок кадров, прежде чем вы сможете использовать какие-либо сходства между кадрами с помощью компрессора 3D-изображений без потерь, так что на лету становится «только с задержкой фрагмента кадров», верно?

Ted Lyngmo 01.11.2018 14:53

Что вы имеете в виду под «сжатием файловой системы» для хранения изображений как png (а не как видео)? Я уже сделал это, и это слишком тяжело.

taihu 01.11.2018 15:01

Да, это был мой первый вариант. Поскольку вы используете png, я думаю, что изображения уже сжаты, и тогда сжатие файловой системы не поможет. Это оставляет вам третий вариант, и я не вижу, как это можно сделать без задержки кадра.

Ted Lyngmo 01.11.2018 15:08

Я не знаю точно, что означает «компрессор 3D-изображений без потерь», означает ли это сжатие последовательности изображений с учетом их сходства, верно? Знаете ли вы какое-либо программное обеспечение для сжатия 3D-изображений без потерь или библиотеку C++?

taihu 01.11.2018 15:40

Да, это я имел в виду. К сожалению, я не знаю никаких бесплатных библиотек, но на эту тему написано много статей, в основном для сжатия 3D-изображений в медицинских приложениях.

Ted Lyngmo 01.11.2018 16:35

Другие вопросы по теме