7

我有一个问题cv::imshow。对于我的图像大小,它通常消耗大约 1-2 毫秒的处理时间,但在我的处理管道中的某个时间点,它对相同类型的图像使用 4-8 毫秒。

我有一个方法

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

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

cvStartWindowThread();

被称为。

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

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

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

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

4

1 回答 1

3

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

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