2014-11-03 2 views
4

Visual C++ 2010 Express에서 OpenCV를 사용하기 시작했습니다. 왜냐하면 MATLAB보다 빠르기 때문입니다.OpenCV와 MATLAB 속도 비교

둘 사이의 공정한 비교를 위해 RGB 이미지를 그레이 스케일로 변환하고 변환 이미지 공간 작업 경과 시간을 계산하는 프로그램을 실행하고 있습니다.

C++ 릴리스에서 작업을 수행하기 위해 cvtColor 명령을 사용하면 평균 약 5 밀리 초가 걸립니다. MATLAB에서 동일한 작업을 수행하면 평균 시간이 다소 줄어 듭니다.

이미 테스트를 마쳤으며 두 프로그램 모두 정상적으로 작동합니다.

OpenCV 속도를 향상시킬 수있는 사람이 있습니까?

C++ 코드.

#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <windows.h> 

using namespace cv; 
using namespace std; 

double PCFreq = 0.0; 
__int64 CounterStart = 0; 

void StartCounter() 
{ 
    LARGE_INTEGER li; 
    if(!QueryPerformanceFrequency(&li)) 
    cout << "QueryPerformanceFrequency failed!\n"; 

    PCFreq = double(li.QuadPart)/1000.0; 

    QueryPerformanceCounter(&li); 
    CounterStart = li.QuadPart; 
} 

double GetCounter() 
{ 
    LARGE_INTEGER li; 
    QueryPerformanceCounter(&li); 
    return double(li.QuadPart-CounterStart)/PCFreq; 
} 

int main() 
{ 
    double time; 
    Mat im, result; 
    im = imread("C:/Imagens_CV/circles_rgb.jpg"); 
    StartCounter(); 
    cvtColor(im,result, CV_BGR2GRAY); 
    time = GetCounter(); 
    cout <<"Process time: "<< time << endl; 
} 

MATLAB 코드에서 OpenCV에서

tic 
img_gray = rgb2gray(img_rgb); 
toc 
+0

FYI : 타이밍면에서 여러 번 평균 시간을 계산하는 것이 좋습니다. – herohuyongtao

+0

예,이 작업을 수행했습니다. 5ms는 평균 시간입니다. 이 질문에이 정보를 추가했습니다. –

+6

이 경우 MATLAB의 속도가 느려지는 이유는 무엇입니까? 함수가 제공되면 최적화 된 구현이 가능할 수 있습니다. 무슨 느린 matlab에 프로그래밍, 명시적인 루프, 등등을하고있다. –

답변

1

색 변환은 컴파일시 사용할 수있는 경우 Intel IPP광범위하게 사용됩니다. modules\imgproc\src\color.cpp을 참조하십시오. More info from Intel. 이 코드에는 OpenMP pragma 또는 TBB 코드가 없으므로 여기서는 도움이되지 않습니다.

재미있는 점은 인텔이 OpenCV에 이러한 기능을 포함하여 무료로 IPP 하위 집합을 사용할 수있는 권한을 부여했다는 것입니다. 자세한 내용은 release summary의 세 번째 항목을 참조하십시오. 그러나이 무료 기능을 사용하려면 OpenCV 3.0 이상을 사용해야합니다. 그렇지 않으면 자신의 IPP 사본으로 컴파일해야합니다.

enter image description here

분명히 cvtColor은 (맨 왼쪽) 많은 도움이되지 않지만, 약간의 향상을 가져옵니다. 다른 기능이 훨씬 뛰어납니다. 당신은 MATLAB에서 rgb2gray 기능 (edit rgb2gray.m)에 대한 호출을 수행하면

1

, 당신은 결국 C++로 구현 된 개인 MEX-기능 imapplymatrixc.mexw64를 호출하는 것을 볼 수 있습니다.

실제로이 공유 라이브러리를 "종속성 워커"와 같은 도구에로드하면 에 대한 종속성이 있음을 알 수 있습니다. 이는 Intel TBB 라이브러리를 사용하여 다중 스레드 기능을 나타냅니다. 은 색 변환 기능의 경우 될 것 같지 않지만

, 이미지 처리 도구 상자가 image arithmetic 기능 중 일부에 대한 Intel IPP 라이브러리를 사용하지 않습니다 (A setting는 "하드웨어의 사용을 활성화/비활성화 제어 할 수있다 최적화 "ippl : iptsetpref('UseIPPL', true)).

또한 gpuArray 입력 배열 (edit gpuArray>rgb2gray.m)을 사용할 때 GPU (CUDA)에서 실행되는 함수 버전이 있습니다. 이를 위해서는 Parallel Computing Toolbox가 필요합니다.

그래서 함수가 잘 최적화되었다고 말하는 것이 안전합니다!