cv :: imshow有时很慢

Mic*_*cka 7 c++ performance opencv highgui imshow

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

我有一个方法

void Tool::displayImage()
{
   startTimeMeasure();
   cv::imshow("output",image);
   evaluateTimeMeasure();
}
Run Code Online (Sandbox Code Playgroud)

image是一个成员变量,highgui窗口是在其他地方创建的.时间测量与boost::posix_time ptimetime_duration.

cvStartWindowThread();
Run Code Online (Sandbox Code Playgroud)

被称为.

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

如果我cv::waitKey(10)在时间测量开始之前添加一个cv::imshow,也变得快速.所以可能会有一些(gui?)需要处理哪些块cv::imshowcv::waitKey(40)在循环中的单独线程中调用,等待键盘输入来控制(例如暂停/恢复)视频.据我所知,cv::imshow是在某种cv::waitKey时间段处理的队列中执行的?!?在哪里可以找到有关在此期间执行的所有任务的信息?也许我可以重新安排我的代码的某些部分(现在真的很复杂),以便一直保持更快imshow.

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

编辑:在"暂停"模式下我在常规执行和处理之间识别的一个区别是,在暂停模式下,该方法是从绑定的鼠标回调函数(来自windowThread?中)启动的,而在常规模式下,它是从主处理线程启动的.

the*_*ine 3

这是 OpenGL 的典型问题,可以使用 OpenGL 创建 OpenCV 窗口。有一个问题SwapBuffers(参见SDL_GL_SwapBuffers() 间歇性缓慢等),通常通过在其之前添加一个小的睡眠来解决。

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

  • @berak你确定吗?我现在正在“window.cpp”中查看“void cv::imshow( const string& winname, InputArray _img )”,它肯定会调用“setOpenGlDrawCallback(winname, glDrawTextureCallback, &tex);”(OpenCV 2.4。 7). 除非您确定,否则请不要对该帖子投反对票。 (2认同)
  • 我们应该删除评论吗? (2认同)
  • 不,可能对遵循相同思路的人有用。 (2认同)