cv :: imshow иногда очень медленный

У меня проблема с cv::imshow, Обычно он занимает около 1-2 мс времени обработки для моего размера изображения, но в какой-то момент в моем конвейере обработки он использует 4-8 мс для изображений того же типа.

У меня есть метод

void Tool::displayImage()
{
startTimeMeasure();
cv::imshow("output",image);
evaluateTimeMeasure();
}

image является переменной-членом, и окно highgui создается где-то еще.
Измерение времени работает с boost::posix_time ptime а также time_duration,

cvStartWindowThread();

назывался.

Дело в том, что если displayImage() вызывается в сложной цепочке обработки (загрузка изображения из видеофайла, некоторая предварительная обработка и т. д.), cv::imshow становится очень медленным, в то время как вызов в «приостановленном» видео для перерисовки обновленного изображения очень быстрый.

Если я добавлю cv::waitKey(10) до начала измерения времени, cv::imshow тоже быстро становится. Таким образом, могут быть некоторые (GUI?) Вещи, которые должны быть обработаны, какой блок cv::imshow? cv::waitKey(40) вызывается в отдельном потоке в цикле, который ожидает ввода с клавиатуры для управления (например, пауза / возобновление) видео.
Насколько я знаю, cv::imshow выполняется в какой-то очереди, которая обрабатывается во время cv::waitKey раз?!? Где я могу найти информацию обо всех задачах, которые выполняются за это время? Может быть, я могу изменить некоторые части моего кода (действительно очень сложный сейчас), чтобы позволить быстрее imshow все время.

Так что же происходит в cv::imshow вызов и какие могут быть причины медленного / быстрого выполнения одного и того же вызова в разных ситуациях?

РЕДАКТИРОВАТЬОдно из различий между обычным выполнением и обработкой в ​​режиме «пауза», которое я обнаружил, заключается в том, что в режиме паузы метод запускается из функции обратного вызова связанной мыши (это происходит из windowThread?) в то время как в обычном режиме он запускается из основного потока обработки.

7

Решение

Это типичная проблема с OpenGL, и окна OpenCV могут быть созданы с использованием OpenGL. Есть проблема с SwapBuffers (увидеть SDL_GL_SwapBuffers () периодически медленно и другие), что часто решается добавлением небольшого сна перед ним.

  • Отключение вертикальной синхронизации в видео драйверах может помочь.
  • Помогает не слишком много открытых окон изображений (типичная проблема многих программ OpenCV).
  • Использование API, отличного от OpenGL, для создания окон может помочь (вероятно, потребуется перекомпиляция highgui).
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]