我已经开始在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
答案 0 :(得分:1)
如果在编译时可用,则OpenCV中的颜色转换将使广泛使用Intel IPP 。见modules\imgproc\src\color.cpp。 More info from Intel。请注意,此代码没有OpenMP pragma或TBB代码,所以在这里没有帮助。
令人兴奋的是,英特尔已授予OpenCV免费使用IPP子集的权利,包括这些功能。有关详细信息,请参阅release summary中的第三项。但是你至少需要使用OpenCV 3.0来获得这个免费的功能;否则你需要使用自己的IPP副本进行编译。
显然,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; ippl
:iptsetpref('UseIPPL', true)
)。
此外,使用gpuArray
输入数组(edit gpuArray>rgb2gray.m
)时,还有一个在GPU(CUDA)上运行的函数版本。这需要并行计算工具箱。
所以可以肯定地说这个功能得到了很好的优化!