perf_norm.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. #include "perf_precomp.hpp"
  2. namespace opencv_test
  3. {
  4. using namespace perf;
  5. #define HAMMING_NORM_SIZES cv::Size(640, 480), cv::Size(1920, 1080)
  6. #define HAMMING_NORM_TYPES CV_8UC1
  7. CV_FLAGS(NormType, NORM_HAMMING2, NORM_HAMMING, NORM_INF, NORM_L1, NORM_L2, NORM_TYPE_MASK, NORM_RELATIVE, NORM_MINMAX)
  8. typedef tuple<Size, MatType, NormType> Size_MatType_NormType_t;
  9. typedef perf::TestBaseWithParam<Size_MatType_NormType_t> Size_MatType_NormType;
  10. PERF_TEST_P(Size_MatType_NormType, norm,
  11. testing::Combine(
  12. testing::Values(TYPICAL_MAT_SIZES),
  13. testing::Values(TYPICAL_MAT_TYPES),
  14. testing::Values((int)NORM_INF, (int)NORM_L1, (int)NORM_L2)
  15. )
  16. )
  17. {
  18. Size sz = get<0>(GetParam());
  19. int matType = get<1>(GetParam());
  20. int normType = get<2>(GetParam());
  21. Mat src(sz, matType);
  22. double n;
  23. declare.in(src, WARMUP_RNG);
  24. TEST_CYCLE() n = cv::norm(src, normType);
  25. SANITY_CHECK(n, 1e-6, ERROR_RELATIVE);
  26. }
  27. PERF_TEST_P(Size_MatType_NormType, norm_mask,
  28. testing::Combine(
  29. testing::Values(TYPICAL_MAT_SIZES),
  30. testing::Values(TYPICAL_MAT_TYPES),
  31. testing::Values((int)NORM_INF, (int)NORM_L1, (int)NORM_L2)
  32. )
  33. )
  34. {
  35. Size sz = get<0>(GetParam());
  36. int matType = get<1>(GetParam());
  37. int normType = get<2>(GetParam());
  38. Mat src(sz, matType);
  39. Mat mask = Mat::ones(sz, CV_8U);
  40. double n;
  41. declare.in(src, WARMUP_RNG).in(mask);
  42. TEST_CYCLE() n = cv::norm(src, normType, mask);
  43. SANITY_CHECK(n, 1e-6, ERROR_RELATIVE);
  44. }
  45. PERF_TEST_P(Size_MatType_NormType, norm2,
  46. testing::Combine(
  47. testing::Values(TYPICAL_MAT_SIZES),
  48. testing::Values(TYPICAL_MAT_TYPES),
  49. testing::Values((int)NORM_INF, (int)NORM_L1, (int)NORM_L2, (int)(NORM_RELATIVE+NORM_INF), (int)(NORM_RELATIVE+NORM_L1), (int)(NORM_RELATIVE+NORM_L2))
  50. )
  51. )
  52. {
  53. Size sz = get<0>(GetParam());
  54. int matType = get<1>(GetParam());
  55. int normType = get<2>(GetParam());
  56. Mat src1(sz, matType);
  57. Mat src2(sz, matType);
  58. double n;
  59. declare.in(src1, src2, WARMUP_RNG);
  60. TEST_CYCLE() n = cv::norm(src1, src2, normType);
  61. SANITY_CHECK(n, 1e-5, ERROR_RELATIVE);
  62. }
  63. PERF_TEST_P(Size_MatType_NormType, norm2_mask,
  64. testing::Combine(
  65. testing::Values(TYPICAL_MAT_SIZES),
  66. testing::Values(TYPICAL_MAT_TYPES),
  67. testing::Values((int)NORM_INF, (int)NORM_L1, (int)NORM_L2, (int)(NORM_RELATIVE|NORM_INF), (int)(NORM_RELATIVE|NORM_L1), (int)(NORM_RELATIVE|NORM_L2))
  68. )
  69. )
  70. {
  71. Size sz = get<0>(GetParam());
  72. int matType = get<1>(GetParam());
  73. int normType = get<2>(GetParam());
  74. Mat src1(sz, matType);
  75. Mat src2(sz, matType);
  76. Mat mask = Mat::ones(sz, CV_8U);
  77. double n;
  78. declare.in(src1, src2, WARMUP_RNG).in(mask);
  79. TEST_CYCLE() n = cv::norm(src1, src2, normType, mask);
  80. SANITY_CHECK(n, 1e-5, ERROR_RELATIVE);
  81. }
  82. namespace {
  83. typedef tuple<NormType, MatType, Size> PerfHamming_t;
  84. typedef perf::TestBaseWithParam<PerfHamming_t> PerfHamming;
  85. PERF_TEST_P(PerfHamming, norm,
  86. testing::Combine(
  87. testing::Values(NORM_HAMMING, NORM_HAMMING2),
  88. testing::Values(HAMMING_NORM_TYPES),
  89. testing::Values(HAMMING_NORM_SIZES)
  90. )
  91. )
  92. {
  93. Size sz = get<2>(GetParam());
  94. int matType = get<1>(GetParam());
  95. int normType = get<0>(GetParam());
  96. Mat src(sz, matType);
  97. double n;
  98. declare.in(src, WARMUP_RNG);
  99. TEST_CYCLE() n = cv::norm(src, normType);
  100. CV_UNUSED(n);
  101. SANITY_CHECK_NOTHING();
  102. }
  103. PERF_TEST_P(PerfHamming, norm2,
  104. testing::Combine(
  105. testing::Values(NORM_HAMMING, NORM_HAMMING2),
  106. testing::Values(HAMMING_NORM_TYPES),
  107. testing::Values(HAMMING_NORM_SIZES)
  108. )
  109. )
  110. {
  111. Size sz = get<2>(GetParam());
  112. int matType = get<1>(GetParam());
  113. int normType = get<0>(GetParam());
  114. Mat src1(sz, matType);
  115. Mat src2(sz, matType);
  116. double n;
  117. declare.in(src1, src2, WARMUP_RNG);
  118. TEST_CYCLE() n = cv::norm(src1, src2, normType);
  119. CV_UNUSED(n);
  120. SANITY_CHECK_NOTHING();
  121. }
  122. }
  123. PERF_TEST_P(Size_MatType_NormType, normalize,
  124. testing::Combine(
  125. testing::Values(TYPICAL_MAT_SIZES),
  126. testing::Values(TYPICAL_MAT_TYPES),
  127. testing::Values((int)NORM_INF, (int)NORM_L1, (int)NORM_L2)
  128. )
  129. )
  130. {
  131. Size sz = get<0>(GetParam());
  132. int matType = get<1>(GetParam());
  133. int normType = get<2>(GetParam());
  134. Mat src(sz, matType);
  135. Mat dst(sz, matType);
  136. double alpha = 100.;
  137. if(normType==NORM_L1) alpha = (double)src.total() * src.channels();
  138. if(normType==NORM_L2) alpha = (double)src.total()/10;
  139. declare.in(src, WARMUP_RNG).out(dst);
  140. TEST_CYCLE() cv::normalize(src, dst, alpha, 0., normType);
  141. SANITY_CHECK(dst, 1e-6);
  142. }
  143. PERF_TEST_P(Size_MatType_NormType, normalize_mask,
  144. testing::Combine(
  145. testing::Values(::perf::szVGA, ::perf::sz1080p),
  146. testing::Values(TYPICAL_MAT_TYPES),
  147. testing::Values((int)NORM_INF, (int)NORM_L1, (int)NORM_L2)
  148. )
  149. )
  150. {
  151. Size sz = get<0>(GetParam());
  152. int matType = get<1>(GetParam());
  153. int normType = get<2>(GetParam());
  154. Mat src(sz, matType);
  155. Mat dst(sz, matType);
  156. Mat mask = Mat::ones(sz, CV_8U);
  157. double alpha = 100.;
  158. if(normType==NORM_L1) alpha = (double)src.total() * src.channels();
  159. if(normType==NORM_L2) alpha = (double)src.total()/10;
  160. declare.in(src, WARMUP_RNG).in(mask).out(dst);
  161. declare.time(100);
  162. TEST_CYCLE() cv::normalize(src, dst, alpha, 0., normType, -1, mask);
  163. SANITY_CHECK(dst, 1e-6);
  164. }
  165. PERF_TEST_P(Size_MatType_NormType, normalize_32f,
  166. testing::Combine(
  167. testing::Values(TYPICAL_MAT_SIZES),
  168. testing::Values(TYPICAL_MAT_TYPES),
  169. testing::Values((int)NORM_INF, (int)NORM_L1, (int)NORM_L2)
  170. )
  171. )
  172. {
  173. Size sz = get<0>(GetParam());
  174. int matType = get<1>(GetParam());
  175. int normType = get<2>(GetParam());
  176. Mat src(sz, matType);
  177. Mat dst(sz, CV_32F);
  178. double alpha = 100.;
  179. if(normType==NORM_L1) alpha = (double)src.total() * src.channels();
  180. if(normType==NORM_L2) alpha = (double)src.total()/10;
  181. declare.in(src, WARMUP_RNG).out(dst);
  182. TEST_CYCLE() cv::normalize(src, dst, alpha, 0., normType, CV_32F);
  183. SANITY_CHECK(dst, 1e-6, ERROR_RELATIVE);
  184. }
  185. PERF_TEST_P( Size_MatType, normalize_minmax, TYPICAL_MATS )
  186. {
  187. Size sz = get<0>(GetParam());
  188. int matType = get<1>(GetParam());
  189. Mat src(sz, matType);
  190. Mat dst(sz, matType);
  191. declare.in(src, WARMUP_RNG).out(dst);
  192. declare.time(30);
  193. TEST_CYCLE() cv::normalize(src, dst, 20., 100., NORM_MINMAX);
  194. SANITY_CHECK(dst, 1e-6, ERROR_RELATIVE);
  195. }
  196. typedef TestBaseWithParam< int > test_len;
  197. PERF_TEST_P(test_len, hal_normL1_u8,
  198. testing::Values(300000, 2000000)
  199. )
  200. {
  201. int len = GetParam();
  202. Mat src1(1, len, CV_8UC1);
  203. Mat src2(1, len, CV_8UC1);
  204. declare.in(src1, src2, WARMUP_RNG);
  205. double n;
  206. TEST_CYCLE() n = hal::normL1_(src1.ptr<uchar>(0), src2.ptr<uchar>(0), len);
  207. CV_UNUSED(n);
  208. SANITY_CHECK_NOTHING();
  209. }
  210. PERF_TEST_P(test_len, hal_normL1_f32,
  211. testing::Values(300000, 2000000)
  212. )
  213. {
  214. int len = GetParam();
  215. Mat src1(1, len, CV_32FC1);
  216. Mat src2(1, len, CV_32FC1);
  217. declare.in(src1, src2, WARMUP_RNG);
  218. double n;
  219. TEST_CYCLE() n = hal::normL1_(src1.ptr<float>(0), src2.ptr<float>(0), len);
  220. CV_UNUSED(n);
  221. SANITY_CHECK_NOTHING();
  222. }
  223. PERF_TEST_P(test_len, hal_normL2Sqr,
  224. testing::Values(300000, 2000000)
  225. )
  226. {
  227. int len = GetParam();
  228. Mat src1(1, len, CV_32FC1);
  229. Mat src2(1, len, CV_32FC1);
  230. declare.in(src1, src2, WARMUP_RNG);
  231. double n;
  232. TEST_CYCLE() n = hal::normL2Sqr_(src1.ptr<float>(0), src2.ptr<float>(0), len);
  233. CV_UNUSED(n);
  234. SANITY_CHECK_NOTHING();
  235. }
  236. } // namespace