diff --git a/samples/gpu/performance/performance.cpp b/samples/gpu/performance/performance.cpp index 03e00654f0..668b733eea 100644 --- a/samples/gpu/performance/performance.cpp +++ b/samples/gpu/performance/performance.cpp @@ -14,6 +14,15 @@ void Test::gen(Mat& mat, int rows, int cols, int type) } +void Test::gen(Mat& mat, int rows, int cols, int type, double low, double high) +{ + mat.create(rows, cols, type); + + RNG rng(0); + rng.fill(mat, RNG::UNIFORM, Scalar::all(low), Scalar::all(high)); +} + + void TestSystem::run() { cout << setiosflags(ios_base::left); @@ -46,13 +55,12 @@ void TestSystem::flush() int cpu_time = static_cast(cpu_elapsed_ / getTickFrequency() * 1000.0); int gpu_time = static_cast(gpu_elapsed_ / getTickFrequency() * 1000.0); - - double speedup = static_cast(cpu_time) / gpu_time; - speedup_total_ += speedup; - cpu_elapsed_ = 0; gpu_elapsed_ = 0; + double speedup = static_cast(cpu_time) / std::max(1, gpu_time); + speedup_total_ += speedup; + cout << " " << setiosflags(ios_base::fixed | ios_base::left); stringstream stream; diff --git a/samples/gpu/performance/performance.h b/samples/gpu/performance/performance.h index 8fbe667f28..9fbb1f6f2a 100644 --- a/samples/gpu/performance/performance.h +++ b/samples/gpu/performance/performance.h @@ -15,6 +15,7 @@ public: const std::string& name() const { return name_; } void gen(cv::Mat& mat, int rows, int cols, int type); + void gen(cv::Mat& mat, int rows, int cols, int type, double low, double high); virtual void run() = 0; @@ -83,7 +84,7 @@ private: #define TEST(name) \ - struct name##_test: public Test \ + struct name##_test: Test \ { \ name##_test(): Test(#name) { TestSystem::instance()->add(this); } \ void run(); \ diff --git a/samples/gpu/performance/tests.cpp b/samples/gpu/performance/tests.cpp index db31237c22..f7753c5876 100644 --- a/samples/gpu/performance/tests.cpp +++ b/samples/gpu/performance/tests.cpp @@ -8,30 +8,30 @@ using namespace cv; TEST(matchTemplate) { Mat image, templ, result; - gen(image, 3000, 3000, CV_8U); + gen(image, 3000, 3000, CV_32F); gpu::GpuMat d_image(image), d_templ, d_result; for (int templ_size = 5; templ_size <= 1000; templ_size *= 2) { - SUBTEST << "img 3000, templ " << templ_size << ", 8U, SQDIFF"; + SUBTEST << "img " << image.rows << ", templ " << templ_size << ", 32F, CCORR"; - gen(templ, templ_size, templ_size, CV_8U); + gen(templ, templ_size, templ_size, CV_32F); CPU_ON; - matchTemplate(image, templ, result, CV_TM_SQDIFF); + matchTemplate(image, templ, result, CV_TM_CCORR); CPU_OFF; d_templ = templ; GPU_ON; - gpu::matchTemplate(d_image, d_templ, d_result, CV_TM_SQDIFF); + gpu::matchTemplate(d_image, d_templ, d_result, CV_TM_CCORR); GPU_OFF; } } -TEST(minMaxLoc) +TEST(minMaxLoc) { Mat src; gpu::GpuMat d_src; @@ -55,4 +55,80 @@ TEST(minMaxLoc) gpu::minMaxLoc(d_src, &min_val, &max_val, &min_loc, &max_loc); GPU_OFF; } +} + + +TEST(remap) +{ + Mat src, dst, xmap, ymap; + gpu::GpuMat d_src, d_dst, d_xmap, d_ymap; + + for (int size = 1000; size <= 8000; size *= 2) + { + SUBTEST << "img " << size << " and 8UC1, 32FC1 maps"; + + gen(src, size, size, CV_8UC1); + gen(xmap, size, size, CV_32FC1, 0, size); + gen(ymap, size, size, CV_32FC1, 0, size); + + CPU_ON; + remap(src, dst, xmap, ymap, INTER_LINEAR); + CPU_OFF; + + d_src = src; + d_xmap = xmap; + d_ymap = ymap; + + GPU_ON; + gpu::remap(d_src, d_dst, d_xmap, d_ymap); + GPU_OFF; + } +} + + +TEST(dft) +{ + Mat src, dst; + gpu::GpuMat d_src, d_dst; + + for (int size = 1000; size <= 4000; size += 1000) + { + SUBTEST << "size " << size << ", 32FC2, complex-to-complex"; + + gen(src, size, size, CV_32FC2); + + CPU_ON; + dft(src, dst); + CPU_OFF; + + d_src = src; + + GPU_ON; + gpu::dft(d_src, d_dst, Size(size, size)); + GPU_OFF; + } +} + + +TEST(cornerHarris) +{ + Mat src, dst; + gpu::GpuMat d_src, d_dst; + + for (int size = 2000; size <= 4000; size *= 2) + { + SUBTEST << "size " << size << ", 32FC1"; + + gen(src, size, size, CV_32FC1); + + CPU_ON; + cornerHarris(src, dst, 5, 7, 0.1, BORDER_REFLECT101); + CPU_OFF; + + d_src = src; + + GPU_ON; + gpu::cornerHarris(d_src, d_dst, 5, 7, 0.1); + GPU_OFF; + } } \ No newline at end of file