DFT OpenCV TAPI中UMat与Mat的速度

时间:2016-04-13 01:09:43

标签: c++ performance opencv image-processing

我发现了一些有关在cv::dft s vs cv::UMat上执行cv::Mat功能的有趣结果。基本上我发现UMat s实际上要慢得多,直到图像达到4096x4096。在此之前,cv::Mat始终如一。这是因为dft没有为TAPI api实现,只有CV :: Mat实现?我运行的测试看起来像这样(我使用celero项目来创建基准测试):

constexpr int num_samples = 2;
constexpr int num_iterations = 10;
constexpr int num_rows = 4096;
constexpr int num_cols = 4096;
cv::UMat a = cv::UMat(num_rows, num_cols, CV_32F);
cv::Mat b = cv::Mat(num_rows, num_cols, CV_32F);

void CreateUMat() { cv::randu(a, 0, 256); }
void CreateMat() { cv::randu(b, 0, 256); }
void DftUMat() {
  CreateUMat();
  cv::dft(a, a);
  cv::idft(a, a, cv::DFT_SCALE | cv::DFT_INVERSE);
}
void DftMat() {
  CreateMat();
  cv::dft(b, b);
  cv::idft(b, b, cv::DFT_SCALE | cv::DFT_INVERSE);
}

BASELINE(UMatBenchmarks, Baseline, num_samples, num_iterations) { DftUMat(); }

BENCHMARK(UMatBenchmarks, NoGPU, num_samples, num_iterations) { DftMat(); }

我得到了以下结果:

cv :: UMat iterations / sec = 4.51

cv :: Mat iterations / sec = 4.70

对于较小的图像,比如说1024x1024,我得到了以下结果:

cv :: UMat iterations / sec = 63.21

cv :: Mat iterations / sec = 85.83

从这些结果中,您可以看到将UMat用于大图像尺寸几乎没有优势,并且在较小的图像上尤其没有优势。这让我感到惊讶,因为在切换到OpenCV TAPI时,cv::matchTemplate获得了重要的加速。我的猜测是cv::dft尚未在OpenCL中实现,但情况确实如此吗? DFT只是一个好的算法卸载到GPUS吗?谢谢!

0 个答案:

没有答案