OPENCV:第一个CVTColor在不同的机器上要慢得多
opencv: First cvtColor is much slower on different machine
获得了OpenCV的某些经验后,我最近将其安装在一些服务器上,该服务器具有强大的图形卡,以受益于CUDA功能。但是,我对"普通" OpenCV进行了一些测试,并意识到即使服务器应该具有更好的硬件,它的运行速度似乎也要慢得多。这是我写的一个小代码来调查此事:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <ctime>
using namespace std;
using namespace cv;
int main (int argc, char **argv)
{
const clock_t begin_time = clock();
Mat OneRBG,OneGray,TwoRBG,TwoGray,ThreeRBG,ThreeGray;
OneRBG=imread("./image.jpg");
cout << float( clock () - begin_time ) / CLOCKS_PER_SEC <<"After imread One"<<endl;
cvtColor(OneRBG, OneGray, CV_BGR2GRAY);
cout << float( clock () - begin_time ) / CLOCKS_PER_SEC <<"After cvtColor One"<<endl;
TwoRBG=imread("./image.jpg");
cout << float( clock () - begin_time ) / CLOCKS_PER_SEC <<"After imread Two"<<endl;
cvtColor(TwoRBG, TwoGray, CV_BGR2GRAY);
cout << float( clock () - begin_time ) / CLOCKS_PER_SEC <<"After cvtColor Two"<<endl;
ThreeRBG=imread("./image.jpg");
cout << float( clock () - begin_time ) / CLOCKS_PER_SEC <<"After imread Three"<<endl;
cvtColor(ThreeRBG, ThreeGray, CV_BGR2GRAY);
cout << float( clock () - begin_time ) / CLOCKS_PER_SEC <<"After cvtColor Three"<<endl;
}
您可以看到,我加载了三次图片,并在打印每个步骤的时间时将其转换为灰度。如果我在某个Mac Mini上的并行机器上运行的Linux上这样做,这就是我得到的:
0.015641 After imread One
0.020779 After cvtColor One
0.038313 After imread Two
0.041601 After cvtColor Two
0.074171 After imread Three
0.076574 After cvtColor Three
很好,很好,这里没有惊喜。但是,当我在上述服务器上运行相同的代码(也具有Ubunutu 16.04)时,它说
0.010095 After imread One
0.577088 After cvtColor One
0.584784 After imread Two
0.586759 After cvtColor Two
0.594362 After imread Three
0.596315 After cvtColor Three
当然,由于硬件的不同,绝对时间有所不同,但是如您所见,第一个cvtcolor所需要的时间比其他任何一个都要多。我确定这里的人足够明智,可以使我震惊。但是,可能更有趣的是,我的另一台计算机没有显示出这种行为,如果有一种使我的服务器行为相同的方法,您可以打赌我很想听到它。
事先感谢您的任何答案,并有一个愉快的一天
我做了一些进一步的研究,发现了一些有趣的东西:http://answers.opencv.org/question/123990/why-is-the-the-first-epc--api-call-so-slow/
我希望我在打扰大家之前已经找到了它,但是我认为这可以解决问题。也许正如Valleymanbs所说,从一开始就在机器1上进行了这种设置。确实,进一步的调查是必要的,但是我认为我可以独自继续进行。
最后一件事,以防万一有人找到这个问题并愉快地复制上面链接中给出的行,我认为他在标题中犯了一些拼写错误。至少对我来说应该写为
...
#include <opencv2/core/ocl.hpp>
....
cv::ocl::setUseOpenCL(false);
感谢大家的时间。
您可以检查任何"奇怪"(例如机器特定)编译标志,无论是在编译OpENCV时和编译代码时:可能是在第一台计算机上,编译器为进行无法在第二个上使用的优化...
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 在我的第一个C++程序中需要一些帮助(简单)
- 为什么我的代码在第一个 if 语句处中断?
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 无法使我的第一个Windows OpenGL窗口抬起并运行
- 将参数初始化为构造函数,而不是第一个
- OPENCV:第一个CVTColor在不同的机器上要慢得多