gapi_operators_tests.hpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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) 2018 Intel Corporation
  6. #ifndef OPENCV_GAPI_OPERATOR_TESTS_COMMON_HPP
  7. #define OPENCV_GAPI_OPERATOR_TESTS_COMMON_HPP
  8. #include "gapi_tests_common.hpp"
  9. namespace opencv_test
  10. {
  11. enum operation
  12. {
  13. ADD, SUB, MUL, DIV,
  14. ADDR, SUBR, MULR, DIVR,
  15. GT, LT, GE, LE, EQ, NE,
  16. GTR, LTR, GER, LER, EQR, NER,
  17. AND, OR, XOR,
  18. ANDR, ORR, XORR
  19. };
  20. // Note: namespace must match the namespace of the type of the printed object
  21. inline std::ostream& operator<<(std::ostream& os, operation op)
  22. {
  23. #define CASE(v) case operation::v: os << #v; break
  24. switch (op)
  25. {
  26. CASE(ADD); CASE(SUB); CASE(MUL); CASE(DIV);
  27. CASE(ADDR); CASE(SUBR); CASE(MULR); CASE(DIVR);
  28. CASE(GT); CASE(LT); CASE(GE); CASE(LE); CASE(EQ); CASE(NE);
  29. CASE(GTR); CASE(LTR); CASE(GER); CASE(LER); CASE(EQR); CASE(NER);
  30. CASE(AND); CASE(OR); CASE(XOR);
  31. CASE(ANDR); CASE(ORR); CASE(XORR);
  32. default: GAPI_Assert(false && "unknown operation value");
  33. }
  34. #undef CASE
  35. return os;
  36. }
  37. namespace
  38. {
  39. // declare test cases for matrix and scalar operators
  40. auto opADD_gapi = [](cv::GMat in,cv::GScalar c){return in + c;};
  41. auto opADD_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::add(in, c, out);};
  42. auto opADDR_gapi = [](cv::GMat in,cv::GScalar c){return c + in;};
  43. auto opADDR_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::add(c, in, out);};
  44. auto opSUB_gapi = [](cv::GMat in,cv::GScalar c){return in - c;};
  45. auto opSUB_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::subtract(in, c, out);};
  46. auto opSUBR_gapi = [](cv::GMat in,cv::GScalar c){return c - in;};
  47. auto opSUBR_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::subtract(c, in, out);};
  48. auto opMUL_gapi = [](cv::GMat in,cv::GScalar c){return in * c;};
  49. auto opMUL_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::multiply(in, c, out);};
  50. auto opMULR_gapi = [](cv::GMat in,cv::GScalar c){return c * in;};
  51. auto opMULR_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::multiply(c, in, out);};
  52. auto opDIV_gapi = [](cv::GMat in,cv::GScalar c){return in / c;};
  53. auto opDIV_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::divide(in, c, out);};
  54. auto opDIVR_gapi = [](cv::GMat in,cv::GScalar c){return c / in;};
  55. auto opDIVR_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::divide(c, in, out);};
  56. auto opGT_gapi = [](cv::GMat in,cv::GScalar c){return in > c;};
  57. auto opGT_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(in, c, out,cv::CMP_GT);};
  58. auto opGTR_gapi = [](cv::GMat in,cv::GScalar c){return c > in;};
  59. auto opGTR_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(c, in, out,cv::CMP_GT);};
  60. auto opLT_gapi = [](cv::GMat in,cv::GScalar c){return in < c;};
  61. auto opLT_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(in, c, out,cv::CMP_LT);};
  62. auto opLTR_gapi = [](cv::GMat in,cv::GScalar c){return c < in;};
  63. auto opLTR_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(c, in, out,cv::CMP_LT);};
  64. auto opGE_gapi = [](cv::GMat in,cv::GScalar c){return in >= c;};
  65. auto opGE_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(in, c, out,cv::CMP_GE);};
  66. auto opGER_gapi = [](cv::GMat in,cv::GScalar c){return c >= in;};
  67. auto opGER_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(c, in, out,cv::CMP_GE);};
  68. auto opLE_gapi = [](cv::GMat in,cv::GScalar c){return in <= c;};
  69. auto opLE_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(in, c, out,cv::CMP_LE);};
  70. auto opLER_gapi = [](cv::GMat in,cv::GScalar c){return c <= in;};
  71. auto opLER_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(c, in, out,cv::CMP_LE);};
  72. auto opEQ_gapi = [](cv::GMat in,cv::GScalar c){return in == c;};
  73. auto opEQ_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(in, c, out,cv::CMP_EQ);};
  74. auto opEQR_gapi = [](cv::GMat in,cv::GScalar c){return c == in;};
  75. auto opEQR_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(c, in, out,cv::CMP_EQ);};
  76. auto opNE_gapi = [](cv::GMat in,cv::GScalar c){return in != c;};
  77. auto opNE_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(in, c, out,cv::CMP_NE);};
  78. auto opNER_gapi = [](cv::GMat in,cv::GScalar c){return c != in;};
  79. auto opNER_ocv = [](const cv::Mat& in, cv::Scalar c, cv::Mat& out){cv::compare(c, in, out,cv::CMP_NE);};
  80. auto opAND_gapi = [](cv::GMat in,cv::GScalar c){return in & c;};
  81. auto opAND_ocv = [](const cv::Mat& in, const cv::Scalar& c, cv::Mat& out){cv::bitwise_and(in, c, out);};
  82. auto opOR_gapi = [](cv::GMat in,cv::GScalar c){return in | c;};
  83. auto opOR_ocv = [](const cv::Mat& in, const cv::Scalar& c, cv::Mat& out){cv::bitwise_or(in, c, out);};
  84. auto opXOR_gapi = [](cv::GMat in,cv::GScalar c){return in ^ c;};
  85. auto opXOR_ocv = [](const cv::Mat& in, const cv::Scalar& c, cv::Mat& out){cv::bitwise_xor(in, c, out);};
  86. auto opANDR_gapi = [](cv::GMat in,cv::GScalar c){return c & in;};
  87. auto opANDR_ocv = [](const cv::Mat& in, const cv::Scalar& c, cv::Mat& out){cv::bitwise_and(c, in, out);};
  88. auto opORR_gapi = [](cv::GMat in,cv::GScalar c){return c | in;};
  89. auto opORR_ocv = [](const cv::Mat& in, const cv::Scalar& c, cv::Mat& out){cv::bitwise_or(c, in, out);};
  90. auto opXORR_gapi = [](cv::GMat in,cv::GScalar c){return c ^ in;};
  91. auto opXORR_ocv = [](const cv::Mat& in, const cv::Scalar& c, cv::Mat& out){cv::bitwise_xor(c, in, out);};
  92. // declare test cases for matrix and matrix operators
  93. auto opADDM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 + in2;};
  94. auto opADDM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::add(in1, in2, out);};
  95. auto opSUBM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 - in2;};
  96. auto opSUBM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::subtract(in1, in2, out);};
  97. auto opDIVM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 / in2;};
  98. auto opDIVM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::divide(in1, in2, out);};
  99. auto opGTM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 > in2;};
  100. auto opGTM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::compare(in1, in2, out, cv::CMP_GT);};
  101. auto opGEM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 >= in2;};
  102. auto opGEM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::compare(in1, in2, out, cv::CMP_GE);};
  103. auto opLTM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 < in2;};
  104. auto opLTM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::compare(in1, in2, out, cv::CMP_LT);};
  105. auto opLEM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 <= in2;};
  106. auto opLEM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::compare(in1, in2, out, cv::CMP_LE);};
  107. auto opEQM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 == in2;};
  108. auto opEQM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::compare(in1, in2, out, cv::CMP_EQ);};
  109. auto opNEM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 != in2;};
  110. auto opNEM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::compare(in1, in2, out, cv::CMP_NE);};
  111. auto opANDM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 & in2;};
  112. auto opANDM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::bitwise_and(in1, in2, out);};
  113. auto opORM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 | in2;};
  114. auto opORM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::bitwise_or(in1, in2, out);};
  115. auto opXORM_gapi = [](cv::GMat in1,cv::GMat in2){return in1 ^ in2;};
  116. auto opXORM_ocv = [](const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out){cv::bitwise_xor(in1, in2, out);};
  117. } // anonymous namespace
  118. struct g_api_ocv_pair_mat_scalar {
  119. using g_api_function_t = std::function<cv::GMat(cv::GMat,cv::GScalar)>;
  120. using ocv_function_t = std::function<void(cv::Mat const&, cv::Scalar, cv::Mat&)>;
  121. g_api_function_t g_api_function;
  122. ocv_function_t ocv_function;
  123. g_api_ocv_pair_mat_scalar() = default;
  124. #define CASE(v) case operation::v: \
  125. g_api_function = op##v##_gapi; \
  126. ocv_function = op##v##_ocv; \
  127. break
  128. g_api_ocv_pair_mat_scalar(operation op)
  129. {
  130. switch (op)
  131. {
  132. CASE(ADD); CASE(SUB); CASE(MUL); CASE(DIV);
  133. CASE(ADDR); CASE(SUBR); CASE(MULR); CASE(DIVR);
  134. CASE(GT); CASE(LT); CASE(GE); CASE(LE); CASE(EQ); CASE(NE);
  135. CASE(GTR); CASE(LTR); CASE(GER); CASE(LER); CASE(EQR); CASE(NER);
  136. CASE(AND); CASE(OR); CASE(XOR);
  137. CASE(ANDR); CASE(ORR); CASE(XORR);
  138. default: GAPI_Assert(false && "unknown operation value");
  139. }
  140. }
  141. #undef CASE
  142. };
  143. struct g_api_ocv_pair_mat_mat {
  144. using g_api_function_t = std::function<cv::GMat(cv::GMat,cv::GMat)>;
  145. using ocv_function_t = std::function<void(cv::Mat const&, cv::Mat const&, cv::Mat&)>;
  146. g_api_function_t g_api_function;
  147. ocv_function_t ocv_function;
  148. g_api_ocv_pair_mat_mat() = default;
  149. #define CASE(v) case operation::v: \
  150. g_api_function = op##v##M_gapi; \
  151. ocv_function = op##v##M_ocv; \
  152. break
  153. g_api_ocv_pair_mat_mat(operation op)
  154. {
  155. switch (op)
  156. {
  157. CASE(ADD); CASE(SUB); CASE(DIV);
  158. CASE(GT); CASE(LT); CASE(GE); CASE(LE); CASE(EQ); CASE(NE);
  159. CASE(AND); CASE(OR); CASE(XOR);
  160. default: GAPI_Assert(false && "unknown operation value");
  161. }
  162. }
  163. #undef CASE
  164. };
  165. // Create new value-parameterized test fixture:
  166. // MathOperatorMatScalarTest - fixture name
  167. // initMatsRandU - function that is used to initialize input/output data
  168. // FIXTURE_API(CompareMats, g_api_ocv_pair_mat_scalar) - test-specific parameters (types)
  169. // 2 - number of test-specific parameters
  170. // cmpF, op - test-spcific parameters (names)
  171. //
  172. // We get:
  173. // 1. Default parameters: int type, cv::Size sz, int dtype, getCompileArgs() function
  174. // - available in test body
  175. // 2. Input/output matrices will be initialized by initMatsRandU (in this fixture)
  176. // 3. Specific parameters: cmpF, op of corresponding types
  177. // - created (and initialized) automatically
  178. // - available in test body
  179. // Note: all parameter _values_ (e.g. type CV_8UC3) are set via INSTANTIATE_TEST_CASE_P macro
  180. GAPI_TEST_FIXTURE(MathOperatorMatScalarTest, initMatsRandU,
  181. FIXTURE_API(CompareMats, operation), 2, cmpF, op)
  182. GAPI_TEST_FIXTURE(MathOperatorMatMatTest, initMatsRandU,
  183. FIXTURE_API(CompareMats, operation), 2, cmpF, op)
  184. GAPI_TEST_FIXTURE(NotOperatorTest, initMatrixRandU, <>, 0)
  185. } // opencv_test
  186. #endif // OPENCV_GAPI_OPERATOR_TESTS_COMMON_HPP