【问题标题】:OpenCV and MATLAB speed comparisonOpenCV 和 MATLAB 速度比较
【发布时间】:2014-11-03 13:46:29
【问题描述】:

我已经开始在 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

【问题讨论】:

  • 仅供参考:就时间而言,最好计算多次的平均时间。
  • 是的,我已经这样做了。 5毫秒是平均时间。我在问题中添加了这些信息。
  • 为什么matlab在这种情况下要慢一些?如果它提供了一个函数,它可能有一个优化的实现。慢的是在matlab中编程,做显式循环等等。
  • 您正在使用的 matlab 代码最终会使用一个 Mex 文件(或类似的文件),在这种情况下,速度或多或少是相同的。您还可以与 Python 中的 OpenCV 进行比较;)
  • 如果您愿意(通过编写 MEX 函数),MathWorks 可以更轻松地从 MATLAB 调用 OpenCV,您会很高兴:mathworks.com/help/vision/ug/opencv-interface.html(这是 R2014b CSVT 工具箱中的新功能) .还有优秀的mexopencv包。

标签: c++ performance matlab opencv


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    如果您在 MATLAB (edit rgb2gray.m) 中跟踪对 rgb2gray 函数的调用,您会发现它最终调用了一个用 C++ 实现的私有 MEX 函数 imapplymatrixc.mexw64

    事实上,如果您将此共享库加载到“Dependency Walker”之类的工具中,您会看到它依赖于tbb.dll,这表明该函数是使用Intel TBB 库的多线程。

    虽然颜色转换函数似乎不是这种情况,但图像处理工具箱确实使用 Intel IPP 库来实现它的一些 image arithmetic 函数(有一个 setting 您可以控制启用/禁用使用“硬件优化”ippl:iptsetpref('UseIPPL', true))。

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-20
      • 2018-02-14
      • 2014-07-14
      • 2011-02-20
      • 2011-04-07
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 2020-05-26
      相关资源
      最近更新 更多