2013-11-07 4 views
7

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

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

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 и каковы могут быть причины медленного/быстрого выполнения одного и того же вызова в разных ситуациях?

EDIT: одна разницы я узнал между регулярным исполнением и обработкой в ​​режиме «пауза» в том, что в режиме паузы метод запускается из связанной функции мыши обратного вызова (что внутри windowThread?) В то время как в обычном режиме он запускается из основного потока обработки.

+0

Любой шанс, что вы нашли объяснение? –

+0

nope ... но did not (должен) следовать за этим дальше ... – Micka

ответ

3

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

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

неправильный ответ. opengl используется только для 3D-контента, а не для 2d-изображения blitting – berak

+2

@berak вы уверены? Я смотрю на 'void cv :: imshow (const string & winname, InputArray _img)' в 'window.cpp' прямо сейчас, и он уверен, что hell вызывает' setOpenGlDrawCallback (winname, glDrawTextureCallback, &tex); '(OpenCV 2.4.7) Пожалуйста, не уменьшайте публикацию сообщения, если вы не уверены. –

+0

Да, это используется только с 3D-контентом. – berak

Смежные вопросы