cv::imshow 有时很慢

cv::imshow sometimes is very slow

本文关键字:imshow cv      更新时间:2023-10-16

我对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::imshow是在某种队列中执行的,该队列在cv::waitKey时间内处理?!?在哪里可以找到有关在此期间执行的所有任务的信息?也许我可以重新排列代码的某些部分(现在非常复杂),以便始终imshow更快。

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

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

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

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