IGHOR 0 Жалоба Опубликовано January 29, 2010 Я начал изучать 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 кадров, но длительность видео не совпадает с реально записанным временем. Скажите как разобраться в этом, как обрабатывается нормализация продолжительности видео? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 31, 2010 Видимо здесь нужно снять статистику по скорости работы программы, замерив среднее время цикла, а потом, исходя из полученных результатов, задавать задержку в параметре framerate. Для замеров времени можно использовать код, находящийся в архиве: duration_demo.zip duration_src.zip Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
IGHOR 0 Жалоба Опубликовано February 2, 2010 Smorodov, спасибо, попробую, но если вычесть среднее значение а видео надо снимать много чесов подряд при том нагрузка ЦП может быть разная и от этого будет меняться задержка, неужели никто с таким не сталкивался? все примеры что нахожу в инете без учитывания такой задержки, странно в общем, буду пробовать Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано February 2, 2010 Есть еще вариант, захватывать и записывать кадры не в цикле, а по прерыванию мультимедиа таймера, он достаточно точно отмеряет интервалы, в отличие от обычного системного таймера, однако интервал должен быть взят с запасом, т.к. приоритет м.м. таймера достаточно высокий, и если функция прерывания будет требовать больше времени, чем интервал таймера, произойдет зависание системы. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
IGHOR 0 Жалоба Опубликовано February 2, 2010 Есть еще вариант, захватывать и записывать кадры не в цикле, а по прерыванию мультимедиа таймера, он достаточно точно отмеряет интервалы, в отличие от обычного системного таймера, однако интервал должен быть взят с запасом, т.к. приоритет м.м. таймера достаточно высокий, и если функция прерывания будет требовать больше времени, чем интервал таймера, произойдет зависание системы. Спасибо, такой вариант хороший, думаю если устроить Frame Skipping то ничего зависать не будет. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах