在获得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比其他任何一个花费的时间要多得多。我相信这里的某些人有足够的智慧向我说明为什么会这样。 然而,可能更有趣的是,我的另一台计算机没有显示出那种行为,如果有办法使我的服务器表现相同,你可以打赌我很想听到它。
提前感谢您的回答并度过愉快的一天
答案 0 :(得分:1)
你可以查看任何&#34;奇怪的&#34; (例如特定于机器的)编译标志,无论是在编译OpenCV时还是在编译代码时:可能是在第一台机器上,编译器正在进行优化而无法在第二台机器上工作......
答案 1 :(得分:1)
我做了一些进一步的研究,发现了一些有趣的东西: http://answers.opencv.org/question/123990/why-is-the-first-opencv-api-call-so-slow/
我希望在困扰你们之前找到它,但我认为它解决了这个问题。也许正如山谷人所说的那样,这个设置从一开始就在机器1上完成。事实上,进一步的调查是必要的,但我想从这里开始,我可以独自进行。
最后一件事,万一有人发现这个问题,并愉快地复制上面链接中给出的行,我认为他在标题中做了一点拼写错误。至少对我而言应该写成
...
#include <opencv2/core/ocl.hpp>
....
cv::ocl::setUseOpenCL(false);
感谢大家的时间。