2017-09-05 696 views
-1

在獲得opencv的一些經驗之後,我最近在一臺帶有強大圖形卡的服務器上安裝了它,以便從cuda功能中受益。然而,我用「普通」opencv做了一些測試,發現即使服務器應該具有更好的硬件,它似乎運行速度也慢得多。這裏是一個小的代碼我寫對此事進行調查:opencv:首先cvtColor在不同的機器上慢得多

#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比其他任何時間都花費更多的時間。我相信這裏有人明智地向我傾訴爲什麼會是這樣。 然而,更令人感興趣的是,我的另一臺計算機沒有顯示出這種行爲,並且如果有辦法讓我的服務器的行爲保持一致,那麼我敢打賭,我很樂意聽到它。

感謝您的任何答案,有一個愉快的一天

+2

對您的測試有一個建議......您不應該依賴單次運行的基準;相反,您應該爲大量試驗運行for循環並採取平均或類似的統計測量。編譯器是否可能知道您正在讀取相同的圖像,以便優化它?也許在每次運行後刪除每個「Mat」?也許可以創建圖像的深層副本*首先*並對這些進行'cvtColor'速度測試。 –

回答

1

你可以檢查任何「怪」(例如機專用)編譯標誌,無論是當你編譯OpenCV的,當你編譯代碼:它可能是第一機器的編譯器做無法在第二個工作,優化...上

0

我做了一些進一步的研究,發現一些有趣的事情: 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); 

感謝大家對你的時間。