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
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设置”,然后在列表中选择垂直同步=关闭。不太可能出现同样的问题,您试图显示的图像更有可能损坏。