gapi_mat_tests.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // This file is part of OpenCV project.
  2. // It is subject to the license terms in the LICENSE file found in the top-level directory
  3. // of this distribution and at http://opencv.org/license.html.
  4. //
  5. // Copyright (C) 2024 Intel Corporation
  6. #include "test_precomp.hpp"
  7. #include <opencv2/gapi/cpu/core.hpp>
  8. #include <opencv2/gapi/ocl/core.hpp>
  9. #include <opencv2/gapi/fluid/core.hpp>
  10. namespace opencv_test
  11. {
  12. namespace
  13. {
  14. enum class KernelPackage: int
  15. {
  16. OCV,
  17. OCL,
  18. FLUID,
  19. };
  20. std::ostream& operator<< (std::ostream &os, const KernelPackage &e)
  21. {
  22. switch (e)
  23. {
  24. #define _C(X) case KernelPackage::X: os << #X; break
  25. _C(OCV);
  26. _C(OCL);
  27. _C(FLUID);
  28. #undef _C
  29. default: GAPI_Error("Unknown package");
  30. }
  31. return os;
  32. }
  33. } // namespace
  34. struct GMatWithValue : public TestWithParam <KernelPackage> {
  35. cv::GKernelPackage getKernelPackage() {
  36. switch (GetParam()) {
  37. case KernelPackage::OCV: return cv::gapi::core::cpu::kernels();
  38. case KernelPackage::OCL: return cv::gapi::core::ocl::kernels();
  39. case KernelPackage::FLUID: return cv::gapi::core::fluid::kernels();
  40. default: GAPI_Error("Unknown package");
  41. }
  42. }
  43. };
  44. TEST_P(GMatWithValue, SingleIsland)
  45. {
  46. cv::Size sz(2, 2);
  47. cv::Mat in_mat = cv::Mat::eye(sz, CV_8U);
  48. cv::GComputationT<cv::GMat(cv::GMat)> addEye([&](cv::GMat in) {
  49. return in + cv::GMat(cv::Mat::eye(sz, CV_8U));
  50. });
  51. cv::Mat out_mat;
  52. addEye.apply(in_mat, out_mat, cv::compile_args(cv::gapi::use_only{getKernelPackage()}));
  53. cv::Mat out_mat_ref = in_mat*2;
  54. EXPECT_EQ(0, cvtest::norm(out_mat, out_mat_ref, NORM_INF));
  55. }
  56. TEST_P(GMatWithValue, GraphWithNoInput)
  57. {
  58. cv::Mat cval = cv::Mat::eye(cv::Size(2, 2), CV_8U);
  59. cv::GMat gval = cv::GMat(cval);
  60. cv::GMat out = cv::gapi::bitwise_not(gval);
  61. cv::Mat out_mat;
  62. cv::GComputation f(cv::GIn(), cv::GOut(out));
  63. // Compiling this isn't supported for now
  64. EXPECT_ANY_THROW(f.compile(cv::descr_of(cval),
  65. cv::compile_args(cv::gapi::use_only{getKernelPackage()})));
  66. }
  67. INSTANTIATE_TEST_CASE_P(GAPI_GMat, GMatWithValue,
  68. Values(KernelPackage::OCV,
  69. KernelPackage::OCL,
  70. KernelPackage::FLUID));
  71. TEST(GAPI_MatWithValue, MultipleIslands)
  72. {
  73. // This test employs a non-trivial island fusion process
  74. // as there's multiple backends in the graph
  75. cv::Size sz(2, 2);
  76. cv::Mat cval2 = cv::Mat::eye(sz, CV_8U) * 2;
  77. cv::Mat cval1 = cv::Mat::eye(sz, CV_8U);
  78. cv::GMat in;
  79. cv::GMat tmp = in + cv::GMat(cval2); // Will be a Fluid operation
  80. cv::GMat out = tmp - cv::GMat(cval1); // Will be an OCV operation
  81. cv::GKernelPackage fluid_kernels = cv::gapi::core::fluid::kernels();
  82. cv::GKernelPackage opencv_kernels = cv::gapi::core::cpu::kernels();
  83. fluid_kernels.remove<cv::gapi::core::GSub>();
  84. opencv_kernels.remove<cv::gapi::core::GAdd>();
  85. auto kernels = cv::gapi::combine(fluid_kernels, opencv_kernels);
  86. cv::Mat in_mat = cv::Mat::zeros(sz, CV_8U);
  87. cv::Mat out_mat;
  88. auto cc = cv::GComputation(in, out)
  89. .compile(cv::descr_of(in_mat),
  90. cv::compile_args(cv::gapi::use_only{kernels}));
  91. cc(cv::gin(in_mat), cv::gout(out_mat));
  92. EXPECT_EQ(0, cvtest::norm(out_mat, cv::Mat::eye(sz, CV_8U), NORM_INF));
  93. }
  94. } // namespace opencv_test