我遇到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
调用会发生什么,以及在不同情况下同一个调用缓慢/快速执行的原因可能是什么?
编辑:在“暂停”模式下我在常规执行和处理之间识别出的一个区别是,在暂停模式下,该方法是从绑定的鼠标回调函数启动的(来自{{1在常规模式下,它从主处理线程开始。
答案 0 :(得分:3)
这是OpenGL的典型问题,可以使用OpenGL创建OpenCV窗口。 SwapBuffers
存在问题(请参阅SDL_GL_SwapBuffers() is intermittently slow和其他人),这通常可以通过在其之前添加一个小睡眠来解决。
highgui
)。