perf_arithm.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. #include "perf_precomp.hpp"
  2. namespace opencv_test
  3. {
  4. using namespace perf;
  5. typedef Size_MatType BinaryOpTest;
  6. PERF_TEST_P_(BinaryOpTest, min)
  7. {
  8. Size sz = get<0>(GetParam());
  9. int type = get<1>(GetParam());
  10. cv::Mat a = Mat(sz, type);
  11. cv::Mat b = Mat(sz, type);
  12. cv::Mat c = Mat(sz, type);
  13. declare.in(a, b, WARMUP_RNG).out(c);
  14. TEST_CYCLE() cv::min(a, b, c);
  15. SANITY_CHECK_NOTHING();
  16. }
  17. PERF_TEST_P_(BinaryOpTest, minScalarDouble)
  18. {
  19. Size sz = get<0>(GetParam());
  20. int type = get<1>(GetParam());
  21. cv::Mat a = Mat(sz, type);
  22. cv::Scalar b;
  23. cv::Mat c = Mat(sz, type);
  24. declare.in(a, b, WARMUP_RNG).out(c);
  25. TEST_CYCLE() cv::min(a, b, c);
  26. SANITY_CHECK_NOTHING();
  27. }
  28. PERF_TEST_P_(BinaryOpTest, minScalarSameType)
  29. {
  30. Size sz = get<0>(GetParam());
  31. int type = get<1>(GetParam());
  32. cv::Mat a = Mat(sz, type);
  33. cv::Scalar b;
  34. cv::Mat c = Mat(sz, type);
  35. declare.in(a, b, WARMUP_RNG).out(c);
  36. if (CV_MAT_DEPTH(type) < CV_32S)
  37. {
  38. b = Scalar(1, 0, 3, 4); // don't pass non-integer values for 8U/8S/16U/16S processing
  39. }
  40. else if (CV_MAT_DEPTH(type) == CV_32S)
  41. {
  42. b = Scalar(1, 0, -3, 4); // don't pass non-integer values for 32S processing
  43. }
  44. TEST_CYCLE() cv::min(a, b, c);
  45. SANITY_CHECK_NOTHING();
  46. }
  47. PERF_TEST_P_(BinaryOpTest, max)
  48. {
  49. Size sz = get<0>(GetParam());
  50. int type = get<1>(GetParam());
  51. cv::Mat a = Mat(sz, type);
  52. cv::Mat b = Mat(sz, type);
  53. cv::Mat c = Mat(sz, type);
  54. declare.in(a, b, WARMUP_RNG).out(c);
  55. TEST_CYCLE() cv::max(a, b, c);
  56. SANITY_CHECK_NOTHING();
  57. }
  58. PERF_TEST_P_(BinaryOpTest, maxScalarDouble)
  59. {
  60. Size sz = get<0>(GetParam());
  61. int type = get<1>(GetParam());
  62. cv::Mat a = Mat(sz, type);
  63. cv::Scalar b;
  64. cv::Mat c = Mat(sz, type);
  65. declare.in(a, b, WARMUP_RNG).out(c);
  66. TEST_CYCLE() cv::max(a, b, c);
  67. SANITY_CHECK_NOTHING();
  68. }
  69. PERF_TEST_P_(BinaryOpTest, maxScalarSameType)
  70. {
  71. Size sz = get<0>(GetParam());
  72. int type = get<1>(GetParam());
  73. cv::Mat a = Mat(sz, type);
  74. cv::Scalar b;
  75. cv::Mat c = Mat(sz, type);
  76. declare.in(a, b, WARMUP_RNG).out(c);
  77. if (CV_MAT_DEPTH(type) < CV_32S)
  78. {
  79. b = Scalar(1, 0, 3, 4); // don't pass non-integer values for 8U/8S/16U/16S processing
  80. }
  81. else if (CV_MAT_DEPTH(type) == CV_32S)
  82. {
  83. b = Scalar(1, 0, -3, 4); // don't pass non-integer values for 32S processing
  84. }
  85. TEST_CYCLE() cv::max(a, b, c);
  86. SANITY_CHECK_NOTHING();
  87. }
  88. PERF_TEST_P_(BinaryOpTest, absdiff)
  89. {
  90. Size sz = get<0>(GetParam());
  91. int type = get<1>(GetParam());
  92. cv::Mat a = Mat(sz, type);
  93. cv::Mat b = Mat(sz, type);
  94. cv::Mat c = Mat(sz, type);
  95. declare.in(a, b, WARMUP_RNG).out(c);
  96. if (CV_MAT_DEPTH(type) == CV_32S)
  97. {
  98. //see ticket 1529: absdiff can be without saturation on 32S
  99. a /= 2;
  100. b /= 2;
  101. }
  102. TEST_CYCLE() cv::absdiff(a, b, c);
  103. SANITY_CHECK_NOTHING();
  104. }
  105. PERF_TEST_P_(BinaryOpTest, absdiffScalarDouble)
  106. {
  107. Size sz = get<0>(GetParam());
  108. int type = get<1>(GetParam());
  109. cv::Mat a = Mat(sz, type);
  110. cv::Scalar b;
  111. cv::Mat c = Mat(sz, type);
  112. declare.in(a, b, WARMUP_RNG).out(c);
  113. if (CV_MAT_DEPTH(type) == CV_32S)
  114. {
  115. //see ticket 1529: absdiff can be without saturation on 32S
  116. a /= 2;
  117. b /= 2;
  118. }
  119. TEST_CYCLE() cv::absdiff(a, b, c);
  120. SANITY_CHECK_NOTHING();
  121. }
  122. PERF_TEST_P_(BinaryOpTest, absdiffScalarSameType)
  123. {
  124. Size sz = get<0>(GetParam());
  125. int type = get<1>(GetParam());
  126. cv::Mat a = Mat(sz, type);
  127. cv::Scalar b;
  128. cv::Mat c = Mat(sz, type);
  129. declare.in(a, b, WARMUP_RNG).out(c);
  130. if (CV_MAT_DEPTH(type) < CV_32S)
  131. {
  132. b = Scalar(1, 0, 3, 4); // don't pass non-integer values for 8U/8S/16U/16S processing
  133. }
  134. else if (CV_MAT_DEPTH(type) == CV_32S)
  135. {
  136. //see ticket 1529: absdiff can be without saturation on 32S
  137. a /= 2;
  138. b = Scalar(1, 0, -3, 4); // don't pass non-integer values for 32S processing
  139. }
  140. TEST_CYCLE() cv::absdiff(a, b, c);
  141. SANITY_CHECK_NOTHING();
  142. }
  143. PERF_TEST_P_(BinaryOpTest, add)
  144. {
  145. Size sz = get<0>(GetParam());
  146. int type = get<1>(GetParam());
  147. cv::Mat a = Mat(sz, type);
  148. cv::Mat b = Mat(sz, type);
  149. cv::Mat c = Mat(sz, type);
  150. declare.in(a, b, WARMUP_RNG).out(c);
  151. declare.time(50);
  152. if (CV_MAT_DEPTH(type) == CV_32S)
  153. {
  154. //see ticket 1529: add can be without saturation on 32S
  155. a /= 2;
  156. b /= 2;
  157. }
  158. TEST_CYCLE() cv::add(a, b, c);
  159. SANITY_CHECK_NOTHING();
  160. }
  161. PERF_TEST_P_(BinaryOpTest, addScalarDouble)
  162. {
  163. Size sz = get<0>(GetParam());
  164. int type = get<1>(GetParam());
  165. cv::Mat a = Mat(sz, type);
  166. cv::Scalar b;
  167. cv::Mat c = Mat(sz, type);
  168. declare.in(a, b, WARMUP_RNG).out(c);
  169. if (CV_MAT_DEPTH(type) == CV_32S)
  170. {
  171. //see ticket 1529: add can be without saturation on 32S
  172. a /= 2;
  173. b /= 2;
  174. }
  175. TEST_CYCLE() cv::add(a, b, c);
  176. SANITY_CHECK_NOTHING();
  177. }
  178. PERF_TEST_P_(BinaryOpTest, addScalarSameType)
  179. {
  180. Size sz = get<0>(GetParam());
  181. int type = get<1>(GetParam());
  182. cv::Mat a = Mat(sz, type);
  183. cv::Scalar b;
  184. cv::Mat c = Mat(sz, type);
  185. declare.in(a, b, WARMUP_RNG).out(c);
  186. if (CV_MAT_DEPTH(type) < CV_32S)
  187. {
  188. b = Scalar(1, 0, 3, 4); // don't pass non-integer values for 8U/8S/16U/16S processing
  189. }
  190. else if (CV_MAT_DEPTH(type) == CV_32S)
  191. {
  192. //see ticket 1529: add can be without saturation on 32S
  193. a /= 2;
  194. b = Scalar(1, 0, -3, 4); // don't pass non-integer values for 32S processing
  195. }
  196. TEST_CYCLE() cv::add(a, b, c, noArray(), type);
  197. SANITY_CHECK_NOTHING();
  198. }
  199. PERF_TEST_P_(BinaryOpTest, subtract)
  200. {
  201. Size sz = get<0>(GetParam());
  202. int type = get<1>(GetParam());
  203. cv::Mat a = Mat(sz, type);
  204. cv::Mat b = Mat(sz, type);
  205. cv::Mat c = Mat(sz, type);
  206. declare.in(a, b, WARMUP_RNG).out(c);
  207. if (CV_MAT_DEPTH(type) == CV_32S)
  208. {
  209. //see ticket 1529: subtract can be without saturation on 32S
  210. a /= 2;
  211. b /= 2;
  212. }
  213. TEST_CYCLE() cv::subtract(a, b, c);
  214. SANITY_CHECK_NOTHING();
  215. }
  216. PERF_TEST_P_(BinaryOpTest, subtractScalarDouble)
  217. {
  218. Size sz = get<0>(GetParam());
  219. int type = get<1>(GetParam());
  220. cv::Mat a = Mat(sz, type);
  221. cv::Scalar b;
  222. cv::Mat c = Mat(sz, type);
  223. declare.in(a, b, WARMUP_RNG).out(c);
  224. if (CV_MAT_DEPTH(type) == CV_32S)
  225. {
  226. //see ticket 1529: subtract can be without saturation on 32S
  227. a /= 2;
  228. b /= 2;
  229. }
  230. TEST_CYCLE() cv::subtract(a, b, c);
  231. SANITY_CHECK_NOTHING();
  232. }
  233. PERF_TEST_P_(BinaryOpTest, subtractScalarSameType)
  234. {
  235. Size sz = get<0>(GetParam());
  236. int type = get<1>(GetParam());
  237. cv::Mat a = Mat(sz, type);
  238. cv::Scalar b;
  239. cv::Mat c = Mat(sz, type);
  240. declare.in(a, b, WARMUP_RNG).out(c);
  241. if (CV_MAT_DEPTH(type) < CV_32S)
  242. {
  243. b = Scalar(1, 0, 3, 4); // don't pass non-integer values for 8U/8S/16U/16S processing
  244. }
  245. else if (CV_MAT_DEPTH(type) == CV_32S)
  246. {
  247. //see ticket 1529: subtract can be without saturation on 32S
  248. a /= 2;
  249. b = Scalar(1, 0, -3, 4); // don't pass non-integer values for 32S processing
  250. }
  251. TEST_CYCLE() cv::subtract(a, b, c, noArray(), type);
  252. SANITY_CHECK_NOTHING();
  253. }
  254. PERF_TEST_P_(BinaryOpTest, multiply)
  255. {
  256. Size sz = get<0>(GetParam());
  257. int type = get<1>(GetParam());
  258. cv::Mat a(sz, type), b(sz, type), c(sz, type);
  259. declare.in(a, b, WARMUP_RNG).out(c);
  260. if (CV_MAT_DEPTH(type) == CV_32S)
  261. {
  262. //According to docs, saturation is not applied when result is 32bit integer
  263. a /= (2 << 16);
  264. b /= (2 << 16);
  265. }
  266. TEST_CYCLE() cv::multiply(a, b, c);
  267. SANITY_CHECK_NOTHING();
  268. }
  269. PERF_TEST_P_(BinaryOpTest, multiplyScale)
  270. {
  271. Size sz = get<0>(GetParam());
  272. int type = get<1>(GetParam());
  273. cv::Mat a(sz, type), b(sz, type), c(sz, type);
  274. double scale = 0.5;
  275. declare.in(a, b, WARMUP_RNG).out(c);
  276. if (CV_MAT_DEPTH(type) == CV_32S)
  277. {
  278. //According to docs, saturation is not applied when result is 32bit integer
  279. a /= (2 << 16);
  280. b /= (2 << 16);
  281. }
  282. TEST_CYCLE() cv::multiply(a, b, c, scale);
  283. SANITY_CHECK_NOTHING();
  284. }
  285. PERF_TEST_P_(BinaryOpTest, divide)
  286. {
  287. Size sz = get<0>(GetParam());
  288. int type = get<1>(GetParam());
  289. cv::Mat a(sz, type), b(sz, type), c(sz, type);
  290. double scale = 0.5;
  291. declare.in(a, b, WARMUP_RNG).out(c);
  292. TEST_CYCLE() cv::divide(a, b, c, scale);
  293. SANITY_CHECK_NOTHING();
  294. }
  295. PERF_TEST_P_(BinaryOpTest, reciprocal)
  296. {
  297. Size sz = get<0>(GetParam());
  298. int type = get<1>(GetParam());
  299. cv::Mat b(sz, type), c(sz, type);
  300. double scale = 0.5;
  301. declare.in(b, WARMUP_RNG).out(c);
  302. TEST_CYCLE() cv::divide(scale, b, c);
  303. SANITY_CHECK_NOTHING();
  304. }
  305. INSTANTIATE_TEST_CASE_P(/*nothing*/ , BinaryOpTest,
  306. testing::Combine(
  307. testing::Values(szVGA, sz720p, sz1080p),
  308. testing::Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_8SC1, CV_16SC1, CV_16SC2, CV_16SC3, CV_16SC4, CV_32SC1, CV_32FC1)
  309. )
  310. );
  311. } // namespace