OPENCV:第一个CVTColor在不同的机器上要慢得多

opencv: First cvtColor is much slower on different machine

本文关键字:机器 第一个 CVTColor OPENCV      更新时间:2023-10-16

获得了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时和编译代码时:可能是在第一台计算机上,编译器为进行无法在第二个上使用的优化...