C++ imshow有时非常慢

C++ imshow有时非常慢,c++,performance,opencv,imshow,highgui,C++,Performance,Opencv,Imshow,Highgui,我对cv::imshow有问题。对于我的图像大小,它通常会消耗大约1-2毫秒的处理时间,但在我的处理管道中,对于相同类型的图像,它会使用4-8毫秒的处理时间 我有办法 void Tool::displayImage() { startTimeMeasure(); cv::imshow("output",image); evaluateTimeMeasure(); } image是一个成员变量,highgui窗口是在其他地方创建的。 时间测量与boost::posix_Time

我对
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::imshow
cv::waitKey(40)
在一个单独的循环线程中调用,该循环等待键盘输入来控制(例如暂停/恢复)视频。 据我所知,
cv::imshow
是在某种队列中执行的,这种队列是在
cv::waitKey
时间内处理的?!?我在哪里可以找到有关在此期间执行的所有任务的信息?也许我可以重新安排代码的某些部分(到目前为止非常复杂),以便始终能够更快地
imshow

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


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

这是OpenGL的典型问题,可以使用OpenGL创建OpenCV窗口。
SwapBuffers
(请参阅和其他内容)有一个问题,通常通过在其之前添加一个小睡眠来解决

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

有没有可能找到解释?没有。。。但是我没有(必须)进一步了解…@berak你确定吗?我现在正在查看
window.cpp
中的
void cv::imshow(const string&winname,InputArray\img)
,它肯定会调用
setOpenGlDrawCallback(winname,glDrawTextureCallback,&tex)(OpenCV 2.4.7)。请不要投反对票,除非你确定。另外,这个问题与表现有关。如果使用了OpenGL(这是我的推测),那么有一些模式与Mika的要求非常相似。可能对某人有价值。我们应该删除注释吗?不,可能对遵循相同思路的人有用。@user1862770在OpenCV配置中的某个位置使用宏选择了不同的API。在nvidia和windows的视频驱动程序中禁用vsync-启动nvidia控制面板,转到“管理3D设置”,然后在列表中选择垂直同步=关闭。不太可能出现同样的问题,您试图显示的图像更有可能损坏。