cv::imshow有时非常缓慢

7

我需要翻译的内容是关于IT技术的,涉及到cv::imshow的问题。通常情况下,在我的图像大小下处理时间只需1-2毫秒,但在处理过程中的某个时刻,对于相同类型的图像,它需要使用4-8毫秒。

我有一个方法

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

image是一个成员变量,而高级窗口则在其他地方创建。 时间测量使用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调用中会发生什么,以及不同情况下相同调用的缓慢/快速执行可能的原因是什么?

编辑:我在正常执行和“暂停”模式下处理之间注意到的一个区别是,在暂停模式下,该方法从绑定的鼠标回调函数启动(即从windowThread 内部开始?)而在常规模式下它从主处理线程启动。


你有没有找到解释的机会? - a-Jays
不,但我没有继续遵循那个。 - Micka
1个回答

3

这是OpenGL的一个典型问题,而OpenCV窗口可以使用OpenGL创建。 SwapBuffers存在问题(请参见SDL_GL_SwapBuffers()间歇性缓慢和其他问题),通常通过在其之前加入小的延迟来解决。

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

2
@berak 你确定吗?我现在正在查看window.cpp中的void cv::imshow(const string& winname, InputArray _img),它确实调用了setOpenGlDrawCallback(winname, glDrawTextureCallback, &tex);(OpenCV 2.4.7)。除非你确定,否则请不要对帖子进行负评。 - the swine
1
此外,问题与性能有关。如果使用了OpenGL(这只是我的猜测),那么就有一些非常相似的模式与Micka所询问的内容相关。对某些人来说可能很有价值。 - the swine
2
我们应该删除这些注释吗? - berak
2
嗯,对于跟随相同思路的人来说可能会有用。 - the swine
1
@user1862770 在 OpenCV 配置的某个地方选择了不同的 API,使用了宏。在 nvidia 和 windows 的视频驱动程序中禁用垂直同步 - 启动 nvidia 控制面板,转到 "管理 3D 设置",在列表中选择垂直同步 = 关闭。这可能不是相同的问题,更有可能是您尝试显示的图像已经损坏。 - the swine
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接