OpenCV和MATLAB速度比较

时间:2014-11-03 13:46:29

标签: c++ performance matlab opencv

我已经开始在Visual C ++ 2010 Express中使用OpenCV,因为它应该比MATLAB更快。

为了在两者之间做一个公平的比较,我运行了一个程序,我将RGB图像转换为灰度对应的程序,并计算转换图像空间操作经过的时间。

使用cvtColor命令在C ++ Release中执行任务,平均需要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代码

tic
img_gray = rgb2gray(img_rgb);
toc

2 个答案:

答案 0 :(得分:1)

如果在编译时可用,则OpenCV中的颜色转换将使广泛使用Intel IPP 。见modules\imgproc\src\color.cppMore info from Intel。请注意,此代码没有OpenMP pragma或TBB代码,所以在这里没有帮助。

令人兴奋的是,英特尔已授予OpenCV免费使用IPP子集的权利,包括这些功能。有关详细信息,请参阅release summary中的第三项。但是你至少需要使用OpenCV 3.0来获得这个免费的功能;否则你需要使用自己的IPP副本进行编译。

enter image description here

显然,cvtColor(最左边)并没有太大的好处,但它会有所提升。其他功能做得更好。

答案 1 :(得分:1)

如果您在MATLAB(edit rgb2gray.m)中跟随rgb2gray函数的调用,您将发现它最终调用在C ++中实现的私有MEX函数imapplymatrixc.mexw64。 / p>

事实上,如果你将这个共享库加载到像#34; Dependency Walker&#34;这样的工具中,你会发现它依赖于tbb.dll,表明该函数是多线程的Intel TBB图书馆。

虽然颜色转换功能似乎不是这样,但图像处理工具箱确实使用Intel IPP库来实现其image arithmetic个功能(有setting您可以控制启用/禁用&#34;硬件优化&#34; ippliptsetpref('UseIPPL', true))。

此外,使用gpuArray输入数组(edit gpuArray>rgb2gray.m)时,还有一个在GPU(CUDA)上运行的函数版本。这需要并行计算工具箱。

所以可以肯定地说这个功能得到了很好的优化!