我需要翻译的内容是关于IT技术的,涉及到cv::imshow
的问题。通常情况下,在我的图像大小下处理时间只需1-2毫秒,但在处理过程中的某个时刻,对于相同类型的图像,它需要使用4-8毫秒。
我有一个方法
void Tool::displayImage()
{
startTimeMeasure();
cv::imshow("output",image);
evaluateTimeMeasure();
}
image
是一个成员变量,而高级窗口则在其他地方创建。
时间测量使用boost::posix_time ptime
和time_duration
。
cvStartWindowThread();
被称为。
问题在于,如果displayImage()
在复杂的处理链内被调用(从视频文件加载图像,进行一些预处理等),cv::imshow
变得非常缓慢,而在“暂停”视频中调用以重新绘制更新后的图像则非常快。
如果在时间测量开始之前添加一个cv::waitKey(10)
,cv::imshow
也会变得很快。因此,可能有一些(GUI?)需要处理的事情会阻塞cv::imshow
吗?cv::waitKey(40)
在轮询中的单独线程中被调用,该轮询等待键盘输入来控制(例如暂停/恢复)视频。据我所知,cv::imshow
在某种队列中执行,该队列在cv::waitKey
时间内被处理?!?我在哪里可以找到有关执行所有这些任务的信息?也许我可以重新排列代码的某些部分(现在真的很复杂)以始终允许更快的imshow
。
那么,在cv::imshow
调用中会发生什么,以及不同情况下相同调用的缓慢/快速执行可能的原因是什么?
编辑:我在正常执行和“暂停”模式下处理之间注意到的一个区别是,在暂停模式下,该方法从绑定的鼠标回调函数启动(即从windowThread
内部开始?)而在常规模式下它从主处理线程启动。