Перейти к содержимому
Compvision.ru
IGHOR

OpenCV синхронизация времени видео

Recommended Posts

Я начал изучать OpenCV недавно, очень понравилось,

но я столкнулся с проблемой, захватываю видео с камеры а в результате получается видео с рассинхронным временем,

оно длиннее/короче за реальное время записи.

Вот пример кода:

...

CvVideoWriter *cvVideoWriter=cvCreateVideoWriter("video.avi",CV_FOURCC('f', 'f', 'd', 's'),25,cvSize(320,240),1);

...

while(true)

{

c_frame = cvQueryFrame(capture);

...

cvWriteFrame(cvVideoWriter,c_frame);

...

if(cvWaitKey(40)>=0)break;

}
в результате получается алгоритм:
цикл

{

захват картинки

обработка картинки

запись видео кадра

пауза 40 мс

}

в идеале задержка 40 мс дает ровно 25 кадров, но на захват обработку и сохранение тоже уходит время,

в результате получается задержка между кадрами 40мс+обработка == неопределенное время задержки которое зависит от загрузки цпу а значит и неверно рассчитвыается FPS

в результате видео записывается ровно в 25 кадров, но длительность видео не совпадает с реально записанным временем.

Скажите как разобраться в этом, как обрабатывается нормализация продолжительности видео?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Видимо здесь нужно снять статистику по скорости работы программы, замерив среднее время цикла, а потом, исходя из полученных результатов, задавать задержку в параметре framerate.

Для замеров времени можно использовать код, находящийся в архиве:

duration_demo.zip

duration_src.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Smorodov, спасибо, попробую, но если вычесть среднее значение а видео надо снимать много чесов подряд при том нагрузка ЦП может быть разная и от этого будет меняться задержка,

неужели никто с таким не сталкивался? все примеры что нахожу в инете без учитывания такой задержки, странно в общем, буду пробовать

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Есть еще вариант, захватывать и записывать кадры не в цикле, а по прерыванию мультимедиа таймера, он достаточно точно отмеряет интервалы, в отличие от обычного системного таймера, однако интервал должен быть взят с запасом, т.к. приоритет м.м. таймера достаточно высокий, и если функция прерывания будет требовать больше времени, чем интервал таймера, произойдет зависание системы.

Спасибо, такой вариант хороший, думаю если устроить Frame Skipping то ничего зависать не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×