cv :: imshow有时很慢

时间:2013-11-07 13:57:02

标签: c++ performance opencv imshow highgui

我遇到cv::imshow的问题。对于我的图像尺寸,它通常需要大约1-2毫秒的处理时间,但在我的处理管道中,对于相同类型的图像,它使用4-8毫秒。

我有一个方法

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

image是一个成员变量,highgui窗口是在其他地方创建的。 时间衡量与boost::posix_time ptimetime_duration一起使用。

cvStartWindowThread();

被召唤。

关键是,如果在复杂的处理链中调用displayImage()(从视频文件加载图像,某些预处理等),cv::imshow变得非常慢,而在“暂停”视频中调用重新绘制更新的图像非常快。

如果我在时间测量开始之前添加cv::waitKey(10)cv::imshow也会变快。那么可能会有一些(gui?)需要处理的事情阻塞cv::imshow?在循环中的单独线程中调用cv::waitKey(40),其等待键盘输入以控制(例如暂停/恢复)视频。 据我所知,cv::imshow是在cv::waitKey次处理的某种队列中执行的?!?在哪里可以找到有关在此期间执行的所有任务的信息?也许我可以重新安排我的代码的某些部分(现在非常复杂),以便始终允许更快imshow

那么cv::imshow调用会发生什么,以及在不同情况下同一个调用缓慢/快速执行的原因可能是什么?

编辑:在“暂停”模式下我在常规执行和处理之间识别出的一个区别是,在暂停模式下,该方法是从绑定的鼠标回调函数启动的(来自{{1在常规模式下,它从主处理线程开始。

1 个答案:

答案 0 :(得分:3)

这是OpenGL的典型问题,可以使用OpenGL创建OpenCV窗口。 SwapBuffers存在问题(请参阅SDL_GL_SwapBuffers() is intermittently slow和其他人),这通常可以通过在其之前添加一个小睡眠来解决。

  • 在视频驱动程序中禁用垂直同步可能会有所帮助。
  • 没有太多的图像窗口打开(许多OpenCV程序的典型瘟疫)有帮助。
  • 使用与OpenGL不同的API来创建窗口可能有所帮助(可能需要重新编译highgui)。