Mic*_*cka 7 c++ performance opencv highgui imshow
我遇到了问题cv::imshow.对于我的图像尺寸,它通常消耗大约1-2毫秒的处理时间,但在我的处理管道中的某个时刻,对于相同类型的图像,它使用4-8毫秒.
我有一个方法
void Tool::displayImage()
{
startTimeMeasure();
cv::imshow("output",image);
evaluateTimeMeasure();
}
Run Code Online (Sandbox Code Playgroud)
image是一个成员变量,highgui窗口是在其他地方创建的.时间测量与boost::posix_time ptime和time_duration.
cvStartWindowThread();
Run Code Online (Sandbox Code Playgroud)
被称为.
关键是,如果displayImage()在复杂的处理链中调用(从视频文件加载图像,某些预处理等),则cv::imshow变得非常慢,而在"暂停"视频中调用以重绘更新的图像的速度非常快.
如果我cv::waitKey(10)在时间测量开始之前添加一个cv::imshow,也变得快速.所以可能会有一些(gui?)需要处理哪些块cv::imshow?cv::waitKey(40)在循环中的单独线程中调用,等待键盘输入来控制(例如暂停/恢复)视频.据我所知,cv::imshow是在某种cv::waitKey时间段处理的队列中执行的?!?在哪里可以找到有关在此期间执行的所有任务的信息?也许我可以重新安排我的代码的某些部分(现在真的很复杂),以便一直保持更快imshow.
那么在一个cv::imshow调用中会发生什么,以及在不同情况下同一个调用缓慢/快速执行的原因是什么?
编辑:在"暂停"模式下我在常规执行和处理之间识别的一个区别是,在暂停模式下,该方法是从绑定的鼠标回调函数(来自windowThread?中)启动的,而在常规模式下,它是从主处理线程启动的.
这是 OpenGL 的典型问题,可以使用 OpenGL 创建 OpenCV 窗口。有一个问题SwapBuffers(参见SDL_GL_SwapBuffers() 间歇性缓慢等),通常通过在其之前添加一个小的睡眠来解决。
highgui)。