1.介绍
在Opencv中,我们经常用Mat对象来保持图像数据,而这种数据之间转换一般是借用CPU,如果电脑有GPU,那么岂不是无用武之地呢?当然不可能,因为本文的猪脚是UMat,UMat与Mat最大的区别在于,如果电脑有GPU,则调GPU,否则是调CPU。
1)Mat------》UMat:Mat::copyTo(OutputArray dst)或者Mat::getUMat(int access_flags)
2)UMat------》Mat:UMat::copyTo(OutputArray dst)或者Mat::getMat(int access_flags)
2.代码
说了这么多,还不如来点代码运行对比一下,其中测试用到图片为5k大小
#include<opencv2\opencv.hpp>
#include<iostream>
#include <chrono>
using namespace std;
using namespace cv;
int main() {
Mat src0 = imread("912_5K_Arizona.png", 1);
Mat dst0;
double time0 = static_cast<double>(getTickCount());
blur(src0, dst0, cv::Size(15, 15));
//GaussianBlur(src0, dst0, cv::Size(3, 3), 1.5);
time0 = ((double)getTickCount() - time0) / getTickFrequency();
cout << "原始运行时间为:" << time0 << "秒" << endl;
//imshow("src0", dst0);
UMat src1;
UMat dst1;
src0.copyTo(src1);
time0 = static_cast<double>(getTickCount());
blur(src1, dst1, cv::Size(15, 15));
//GaussianBlur(src1, dst1, cv::Size(3, 3), 1.5);
time0 = ((double)getTickCount() - time0) / getTickFrequency();
cout << "通过opengl的运行时间为:" << time0 << "秒" << endl;
//imshow("dst1", dst1);
waitKey(0);
return 0;
}
在Debug的情况下:
在Release的情况下