// This file is part of OpenCV project. // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. // // Copyright (C) 2018 Intel Corporation #include "../../test/common/gapi_tests_common.hpp" #include "opencv2/gapi/imgproc.hpp" namespace opencv_test { using namespace perf; //------------------------------------------------------------------------------ class SepFilterPerfTest : public TestPerfParams> {}; PERF_TEST_P_(SepFilterPerfTest, TestPerformance) { MatType type = 0; int kernSize = 0, dtype = 0; cv::Size sz; std::tie(type, kernSize, sz, dtype) = GetParam(); cv::Mat kernelX(kernSize, 1, CV_32F); cv::Mat kernelY(kernSize, 1, CV_32F); randu(kernelX, -1, 1); randu(kernelY, -1, 1); initMatsRandN(type, sz, dtype, false); cv::Point anchor = cv::Point(-1, -1); // OpenCV code ///////////////////////////////////////////////////////////// { cv::sepFilter2D(in_mat1, out_mat_ocv, dtype, kernelX, kernelY ); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::sepFilter(in, dtype, kernelX, kernelY, anchor, cv::Scalar() ); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class Filter2DPerfTest : public TestPerfParams> {}; PERF_TEST_P_(Filter2DPerfTest, TestPerformance) { MatType type = 0; int kernSize = 0, borderType = 0, dtype = 0; cv::Size sz; std::tie(type, kernSize, sz, borderType, dtype) = GetParam(); initMatsRandN(type, sz, dtype, false); cv::Point anchor = {-1, -1}; double delta = 0; cv::Mat kernel = cv::Mat(kernSize, kernSize, CV_32FC1 ); cv::Scalar kernMean = cv::Scalar::all(1.0); cv::Scalar kernStddev = cv::Scalar::all(2.0/3); randn(kernel, kernMean, kernStddev); // OpenCV code ///////////////////////////////////////////////////////////// { cv::filter2D(in_mat1, out_mat_ocv, dtype, kernel, anchor, delta, borderType); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::filter2D(in, dtype, kernel, anchor, delta, borderType); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class BoxFilterPerfTest : public TestPerfParams> {}; PERF_TEST_P_(BoxFilterPerfTest, TestPerformance) { MatType type = 0; int filterSize = 0, borderType = 0, dtype = 0; cv::Size sz; double tolerance = 0.0; std::tie(type, filterSize, sz, borderType, dtype, tolerance) = GetParam(); initMatsRandN(type, sz, dtype, false); cv::Point anchor = {-1, -1}; bool normalize = true; // OpenCV code ///////////////////////////////////////////////////////////// { cv::boxFilter(in_mat1, out_mat_ocv, dtype, cv::Size(filterSize, filterSize), anchor, normalize, borderType); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::boxFilter(in, dtype, cv::Size(filterSize, filterSize), anchor, normalize, borderType); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { cv::Mat absDiff; cv::absdiff(out_mat_gapi, out_mat_ocv, absDiff); EXPECT_EQ(0, cv::countNonZero(absDiff > tolerance)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class BlurPerfTest : public TestPerfParams> {}; PERF_TEST_P_(BlurPerfTest, TestPerformance) { MatType type = 0; int filterSize = 0, borderType = 0; cv::Size sz; double tolerance = 0.0; std::tie(type, filterSize, sz, borderType, tolerance) = GetParam(); initMatsRandN(type, sz, type, false); cv::Point anchor = {-1, -1}; // OpenCV code ///////////////////////////////////////////////////////////// { cv::blur(in_mat1, out_mat_ocv, cv::Size(filterSize, filterSize), anchor, borderType); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::blur(in, cv::Size(filterSize, filterSize), anchor, borderType); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { cv::Mat absDiff; cv::absdiff(out_mat_gapi, out_mat_ocv, absDiff); EXPECT_EQ(0, cv::countNonZero(absDiff > tolerance)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class GaussianBlurPerfTest : public TestPerfParams> {}; PERF_TEST_P_(GaussianBlurPerfTest, TestPerformance) { MatType type = 0; int kernSize = 0; cv::Size sz; std::tie(type, kernSize, sz) = GetParam(); cv::Size kSize = cv::Size(kernSize, kernSize); auto& rng = cv::theRNG(); double sigmaX = rng(); initMatsRandN(type, sz, type, false); // OpenCV code /////////////////////////////////////////////////////////// cv::GaussianBlur(in_mat1, out_mat_ocv, kSize, sigmaX); // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::gaussianBlur(in, kSize, sigmaX); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison //////////////////////////////////////////////////////////// EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class MedianBlurPerfTest : public TestPerfParams> {}; PERF_TEST_P_(MedianBlurPerfTest, TestPerformance) { MatType type = 0; int kernSize = 0; cv::Size sz; std::tie(type, kernSize, sz) = GetParam(); initMatsRandN(type, sz, type, false); // OpenCV code ///////////////////////////////////////////////////////////// { cv::medianBlur(in_mat1, out_mat_ocv, kernSize); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::medianBlur(in, kernSize); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class ErodePerfTest : public TestPerfParams> {}; PERF_TEST_P_(ErodePerfTest, TestPerformance) { MatType type = 0; int kernSize = 0, kernType = 0; cv::Size sz; std::tie(type, kernSize, sz, kernType) = GetParam(); initMatsRandN(type, sz, type, false); cv::Mat kernel = cv::getStructuringElement(kernType, cv::Size(kernSize, kernSize)); // OpenCV code ///////////////////////////////////////////////////////////// { cv::erode(in_mat1, out_mat_ocv, kernel); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::erode(in, kernel); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class Erode3x3PerfTest : public TestPerfParams> {}; PERF_TEST_P_(Erode3x3PerfTest, TestPerformance) { MatType type = 0; int numIters = 0; cv::Size sz; std::tie(type, sz, numIters) = GetParam(); initMatsRandN(type, sz, type, false); cv::Mat kernel = cv::getStructuringElement(cv::MorphShapes::MORPH_RECT, cv::Size(3, 3)); // OpenCV code ///////////////////////////////////////////////////////////// { cv::erode(in_mat1, out_mat_ocv, kernel, cv::Point(-1, -1), numIters); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::erode3x3(in, numIters); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class DilatePerfTest : public TestPerfParams> {}; PERF_TEST_P_(DilatePerfTest, TestPerformance) { MatType type = 0; int kernSize = 0, kernType = 0; cv::Size sz; std::tie(type, kernSize, sz, kernType) = GetParam(); initMatsRandN(type, sz, type, false); cv::Mat kernel = cv::getStructuringElement(kernType, cv::Size(kernSize, kernSize)); // OpenCV code ///////////////////////////////////////////////////////////// { cv::dilate(in_mat1, out_mat_ocv, kernel); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::dilate(in, kernel); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class Dilate3x3PerfTest : public TestPerfParams> {}; PERF_TEST_P_(Dilate3x3PerfTest, TestPerformance) { MatType type = 0; int numIters = 0; cv::Size sz; std::tie(type, sz, numIters) = GetParam(); initMatsRandN(type, sz, type, false); cv::Mat kernel = cv::getStructuringElement(cv::MorphShapes::MORPH_RECT, cv::Size(3, 3)); // OpenCV code ///////////////////////////////////////////////////////////// { cv::dilate(in_mat1, out_mat_ocv, kernel, cv::Point(-1,-1), numIters); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::dilate3x3(in, numIters); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class SobelPerfTest : public TestPerfParams> {}; PERF_TEST_P_(SobelPerfTest, TestPerformance) { MatType type = 0; int kernSize = 0, dtype = 0, dx = 0, dy = 0; cv::Size sz; std::tie(type, kernSize, sz, dtype, dx, dy) = GetParam(); initMatsRandN(type, sz, dtype, false); // OpenCV code ///////////////////////////////////////////////////////////// { cv::Sobel(in_mat1, out_mat_ocv, dtype, dx, dy, kernSize); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::sobel(in, dtype, dx, dy, kernSize ); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class CannyPerfTest : public TestPerfParams> {}; PERF_TEST_P_(CannyPerfTest, TestPerformance) { MatType type; int apSize = 0; double thrLow = 0.0, thrUp = 0.0; cv::Size sz; bool l2gr = false; std::tie(type, sz, thrLow, thrUp, apSize, l2gr) = GetParam(); initMatsRandN(type, sz, CV_8UC1, false); // OpenCV code ///////////////////////////////////////////////////////////// { cv::Canny(in_mat1, out_mat_ocv, thrLow, thrUp, apSize, l2gr); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::Canny(in, thrLow, thrUp, apSize, l2gr); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class EqHistPerfTest : public TestPerfParams {}; PERF_TEST_P_(EqHistPerfTest, TestPerformance) { cv::Size sz = GetParam(); initMatsRandN(CV_8UC1, sz, CV_8UC1, false); // OpenCV code ///////////////////////////////////////////////////////////// { cv::equalizeHist(in_mat1, out_mat_ocv); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::equalizeHist(in); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class RGB2GrayPerfTest : public TestPerfParams {}; PERF_TEST_P_(RGB2GrayPerfTest, TestPerformance) { cv::Size sz = GetParam(); initMatsRandN(CV_8UC3, sz, CV_8UC1, false); // OpenCV code ///////////////////////////////////////////////////////////// { cv::cvtColor(in_mat1, out_mat_ocv, cv::COLOR_RGB2GRAY); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::RGB2Gray(in); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class BGR2GrayPerfTest : public TestPerfParams {}; PERF_TEST_P_(BGR2GrayPerfTest, TestPerformance) { cv::Size sz = GetParam(); initMatsRandN(CV_8UC3, sz, CV_8UC1, false); // OpenCV code ///////////////////////////////////////////////////////////// { cv::cvtColor(in_mat1, out_mat_ocv, cv::COLOR_BGR2GRAY); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::BGR2Gray(in); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class RGB2YUVPerfTest : public TestPerfParams {}; PERF_TEST_P_(RGB2YUVPerfTest, TestPerformance) { cv::Size sz = GetParam(); initMatsRandN(CV_8UC3, sz, CV_8UC3, false); // OpenCV code ///////////////////////////////////////////////////////////// { cv::cvtColor(in_mat1, out_mat_ocv, cv::COLOR_RGB2YUV); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::RGB2YUV(in); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class YUV2RGBPerfTest : public TestPerfParams {}; PERF_TEST_P_(YUV2RGBPerfTest, TestPerformance) { cv::Size sz = GetParam(); initMatsRandN(CV_8UC3, sz, CV_8UC3, false); // OpenCV code ///////////////////////////////////////////////////////////// { cv::cvtColor(in_mat1, out_mat_ocv, cv::COLOR_YUV2RGB); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::YUV2RGB(in); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class RGB2LabPerfTest : public TestPerfParams {}; PERF_TEST_P_(RGB2LabPerfTest, TestPerformance) { cv::Size sz = GetParam(); initMatsRandN(CV_8UC3, sz, CV_8UC3, false); // OpenCV code ///////////////////////////////////////////////////////////// { cv::cvtColor(in_mat1, out_mat_ocv, cv::COLOR_RGB2Lab); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::RGB2Lab(in); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class BGR2LUVPerfTest : public TestPerfParams {}; PERF_TEST_P_(BGR2LUVPerfTest, TestPerformance) { cv::Size sz = GetParam(); initMatsRandN(CV_8UC3, sz, CV_8UC3, false); // OpenCV code ///////////////////////////////////////////////////////////// { cv::cvtColor(in_mat1, out_mat_ocv, cv::COLOR_BGR2Luv); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::BGR2LUV(in); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class LUV2BGRPerfTest : public TestPerfParams {}; PERF_TEST_P_(LUV2BGRPerfTest, TestPerformance) { cv::Size sz = GetParam(); initMatsRandN(CV_8UC3, sz, CV_8UC3, false); // OpenCV code ///////////////////////////////////////////////////////////// { cv::cvtColor(in_mat1, out_mat_ocv, cv::COLOR_Luv2BGR); } // G-API code ////////////////////////////////////////////////////////////// cv::GMat in; auto out = cv::gapi::LUV2BGR(in); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } // Comparison ////////////////////////////////////////////////////////////// { EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); } SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class BGR2YUVPerfTest : public TestPerfParams {}; PERF_TEST_P_(BGR2YUVPerfTest, TestPerformance) { cv::Size sz = GetParam(); initMatsRandN(CV_8UC3, sz, CV_8UC3, false); cv::cvtColor(in_mat1, out_mat_ocv, cv::COLOR_BGR2YUV); cv::GMat in; auto out = cv::gapi::BGR2YUV(in); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ class YUV2BGRPerfTest : public TestPerfParams {}; PERF_TEST_P_(YUV2BGRPerfTest, TestPerformance) { cv::Size sz = GetParam(); initMatsRandN(CV_8UC3, sz, CV_8UC3, false); cv::cvtColor(in_mat1, out_mat_ocv, cv::COLOR_YUV2BGR); cv::GMat in; auto out = cv::gapi::YUV2BGR(in); cv::GComputation c(in, out); // Warm-up graph engine: c.apply(in_mat1, out_mat_gapi); TEST_CYCLE() { c.apply(in_mat1, out_mat_gapi); } EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); EXPECT_EQ(out_mat_gapi.size(), sz); SANITY_CHECK_NOTHING(); } //------------------------------------------------------------------------------ }