cv::imshow 有时很慢

Posted

技术标签:

【中文标题】cv::imshow 有时很慢【英文标题】:cv::imshow sometimes is very slow 【发布时间】:2013-11-19 04:59:27 【问题描述】:

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::imshowcv::waitKey(40) 在循环中的单独线程中调用,该线程等待键盘输入以控制(例如暂停/恢复)视频。 据我所知,cv::imshowcv::waitKey 次处理的某种队列中执行?!?我在哪里可以找到有关在此期间执行的所有任务的信息?也许我可以重新排列我的代码的某些部分(现在真的很复杂),让imshow 一直更快。

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

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

【问题讨论】:

你找到解释了吗? 不...但没有(必须)进一步遵循... 【参考方案1】:

这是 OpenGL 的典型问题,可以使用 OpenGL 创建 OpenCV 窗口。 SwapBuffers有一个问题(见SDL_GL_SwapBuffers() is intermittently slow等),通常在它前面加个小sleep来解决。

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

【讨论】:

@berak 你确定吗?我现在正在查看window.cpp 中的void cv::imshow( const string& winname, InputArray _img ),它肯定会调用setOpenGlDrawCallback(winname, glDrawTextureCallback, &tex);(OpenCV 2.4.7)。除非您确定,否则请不要对帖子投反对票。 另外,这个问题与性能有关。如果使用了 OpenGL(这是我的推测),则有一些与 Micka 所要求的非常相似的模式。可能对某人有价值。 我们应该删除 cmets 吗? 不,可能对遵循相同思路的人有用。 @user1862770 在 OpenCV 配置中的某处使用宏选择了不同的 API。在 nvidia 和 windows 的视频驱动程序中禁用垂直同步 - 启动 nvidia 控制面板,转到“管理 3D 设置”并在列表中选择垂直同步 = 关闭。不太可能是同样的问题,您尝试显示的图像很可能已损坏。

以上是关于cv::imshow 有时很慢的主要内容,如果未能解决你的问题,请参考以下文章

plt.imshow与cv2.imshow显示颜色问题

cv2.imshow() 在 Mac 上崩溃

cv2.imshow() 函数抛出断言错误

imshow() 在 Python 中为图像提供错误

OpenCV 函数学习03-图像的显示(cv2.imshow)

plt.show 和 cv2.imshow 的区别?