У меня проблема с 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
?) в то время как в обычном режиме он запускается из основного потока обработки.
Это типичная проблема с OpenGL, и окна OpenCV могут быть созданы с использованием OpenGL. Есть проблема с SwapBuffers
(увидеть SDL_GL_SwapBuffers () периодически медленно и другие), что часто решается добавлением небольшого сна перед ним.
highgui
).Других решений пока нет …