test_arithm.cpp 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973
  1. /*M///////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
  4. //
  5. // By downloading, copying, installing or using the software you agree to this license.
  6. // If you do not agree to this license, do not download, install,
  7. // copy or use the software.
  8. //
  9. //
  10. // License Agreement
  11. // For Open Source Computer Vision Library
  12. //
  13. // Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
  14. // Third party copyrights are property of their respective owners.
  15. //
  16. // Redistribution and use in source and binary forms, with or without modification,
  17. // are permitted provided that the following conditions are met:
  18. //
  19. // * Redistribution's of source code must retain the above copyright notice,
  20. // this list of conditions and the following disclaimer.
  21. //
  22. // * Redistribution's in binary form must reproduce the above copyright notice,
  23. // this list of conditions and the following disclaimer in the documentation
  24. // and/or other materials provided with the distribution.
  25. //
  26. // * The name of the copyright holders may not be used to endorse or promote products
  27. // derived from this software without specific prior written permission.
  28. //
  29. // This software is provided by the copyright holders and contributors "as is" and
  30. // any express or implied warranties, including, but not limited to, the implied
  31. // warranties of merchantability and fitness for a particular purpose are disclaimed.
  32. // In no event shall the OpenCV Foundation or contributors be liable for any direct,
  33. // indirect, incidental, special, exemplary, or consequential damages
  34. // (including, but not limited to, procurement of substitute goods or services;
  35. // loss of use, data, or profits; or business interruption) however caused
  36. // and on any theory of liability, whether in contract, strict liability,
  37. // or tort (including negligence or otherwise) arising in any way out of
  38. // the use of this software, even if advised of the possibility of such damage.
  39. //
  40. //M*/
  41. #include "../test_precomp.hpp"
  42. #include "opencv2/ts/ocl_test.hpp"
  43. #ifdef HAVE_OPENCL
  44. namespace opencv_test {
  45. namespace ocl {
  46. //////////////////////////////// LUT /////////////////////////////////////////////////
  47. PARAM_TEST_CASE(Lut, MatDepth, MatDepth, Channels, bool, bool)
  48. {
  49. int src_depth, lut_depth;
  50. int cn;
  51. bool use_roi, same_cn;
  52. TEST_DECLARE_INPUT_PARAMETER(src);
  53. TEST_DECLARE_INPUT_PARAMETER(lut);
  54. TEST_DECLARE_OUTPUT_PARAMETER(dst);
  55. virtual void SetUp()
  56. {
  57. src_depth = GET_PARAM(0);
  58. lut_depth = GET_PARAM(1);
  59. cn = GET_PARAM(2);
  60. same_cn = GET_PARAM(3);
  61. use_roi = GET_PARAM(4);
  62. }
  63. void generateTestData()
  64. {
  65. const int src_type = CV_MAKE_TYPE(src_depth, cn);
  66. const int lut_type = CV_MAKE_TYPE(lut_depth, same_cn ? cn : 1);
  67. const int dst_type = CV_MAKE_TYPE(lut_depth, cn);
  68. Size roiSize = randomSize(1, MAX_VALUE);
  69. Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  70. randomSubMat(src, src_roi, roiSize, srcBorder, src_type, 0, 256);
  71. Size lutRoiSize = Size(256, 1);
  72. Border lutBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  73. randomSubMat(lut, lut_roi, lutRoiSize, lutBorder, lut_type, 5, 16);
  74. Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  75. randomSubMat(dst, dst_roi, roiSize, dstBorder, dst_type, 5, 16);
  76. UMAT_UPLOAD_INPUT_PARAMETER(src);
  77. UMAT_UPLOAD_INPUT_PARAMETER(lut);
  78. UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
  79. }
  80. void Near(double threshold = 0.)
  81. {
  82. OCL_EXPECT_MATS_NEAR(dst, threshold);
  83. }
  84. };
  85. OCL_TEST_P(Lut, Mat)
  86. {
  87. for (int j = 0; j < test_loop_times; j++)
  88. {
  89. generateTestData();
  90. OCL_OFF(cv::LUT(src_roi, lut_roi, dst_roi));
  91. OCL_ON(cv::LUT(usrc_roi, ulut_roi, udst_roi));
  92. Near();
  93. }
  94. }
  95. ///////////////////////// ArithmTestBase ///////////////////////////
  96. PARAM_TEST_CASE(ArithmTestBase, MatDepth, Channels, bool)
  97. {
  98. int depth;
  99. int cn;
  100. bool use_roi;
  101. cv::Scalar val;
  102. cv::Scalar val_in_range;
  103. TEST_DECLARE_INPUT_PARAMETER(src1);
  104. TEST_DECLARE_INPUT_PARAMETER(src2);
  105. TEST_DECLARE_INPUT_PARAMETER(mask);
  106. TEST_DECLARE_OUTPUT_PARAMETER(dst1);
  107. TEST_DECLARE_OUTPUT_PARAMETER(dst2);
  108. virtual void SetUp()
  109. {
  110. depth = GET_PARAM(0);
  111. cn = GET_PARAM(1);
  112. use_roi = GET_PARAM(2);
  113. }
  114. void generateTestData(bool with_val_in_range = false)
  115. {
  116. const int type = CV_MAKE_TYPE(depth, cn);
  117. double minV = cvtest::getMinVal(type);
  118. double maxV = cvtest::getMaxVal(type);
  119. Size roiSize = randomSize(1, MAX_VALUE);
  120. Border src1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
  121. randomSubMat(src1, src1_roi, roiSize, src1Border, type, 2, 11); // FIXIT: Test with minV, maxV
  122. Border src2Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
  123. randomSubMat(src2, src2_roi, roiSize, src2Border, type, std::max(-1540., minV), std::min(1740., maxV));
  124. Border dst1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
  125. randomSubMat(dst1, dst1_roi, roiSize, dst1Border, type, 5, 16);
  126. Border dst2Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
  127. randomSubMat(dst2, dst2_roi, roiSize, dst2Border, type, 5, 16);
  128. Border maskBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  129. randomSubMat(mask, mask_roi, roiSize, maskBorder, CV_8UC1, 0, 2);
  130. cv::threshold(mask, mask, 0.5, 255., CV_8UC1);
  131. *mask.ptr(0) = 255; // prevent test case with mask filled 0 only
  132. val = cv::Scalar(rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0),
  133. rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0));
  134. if (with_val_in_range)
  135. {
  136. val_in_range = cv::Scalar(rng.uniform(minV, maxV), rng.uniform(minV, maxV),
  137. rng.uniform(minV, maxV), rng.uniform(minV, maxV));
  138. }
  139. UMAT_UPLOAD_INPUT_PARAMETER(src1);
  140. UMAT_UPLOAD_INPUT_PARAMETER(src2);
  141. UMAT_UPLOAD_INPUT_PARAMETER(mask);
  142. UMAT_UPLOAD_OUTPUT_PARAMETER(dst1);
  143. UMAT_UPLOAD_OUTPUT_PARAMETER(dst2);
  144. }
  145. void Near(double threshold = 0., bool relative = false)
  146. {
  147. if (!relative)
  148. OCL_EXPECT_MATS_NEAR(dst1, threshold);
  149. else
  150. OCL_EXPECT_MATS_NEAR_RELATIVE(dst1, threshold);
  151. }
  152. void Near1(double threshold = 0.)
  153. {
  154. OCL_EXPECT_MATS_NEAR(dst2, threshold);
  155. }
  156. };
  157. //////////////////////////////// Add /////////////////////////////////////////////////
  158. typedef ArithmTestBase Add;
  159. OCL_TEST_P(Add, Mat)
  160. {
  161. for (int j = 0; j < test_loop_times; j++)
  162. {
  163. generateTestData();
  164. OCL_OFF(cv::add(src1_roi, src2_roi, dst1_roi));
  165. OCL_ON(cv::add(usrc1_roi, usrc2_roi, udst1_roi));
  166. Near(0);
  167. }
  168. }
  169. OCL_TEST_P(Add, Mat_Mask)
  170. {
  171. for (int j = 0; j < test_loop_times; j++)
  172. {
  173. generateTestData();
  174. OCL_OFF(cv::add(src1_roi, src2_roi, dst1_roi, mask_roi));
  175. OCL_ON(cv::add(usrc1_roi, usrc2_roi, udst1_roi, umask_roi));
  176. Near(0);
  177. }
  178. }
  179. OCL_TEST_P(Add, Scalar)
  180. {
  181. for (int j = 0; j < test_loop_times; j++)
  182. {
  183. generateTestData();
  184. OCL_OFF(cv::add(src1_roi, val, dst1_roi));
  185. OCL_ON(cv::add(val, usrc1_roi, udst1_roi));
  186. Near(1e-5);
  187. }
  188. }
  189. OCL_TEST_P(Add, Scalar_Mask)
  190. {
  191. for (int j = 0; j < test_loop_times; j++)
  192. {
  193. generateTestData();
  194. OCL_OFF(cv::add(src1_roi, val, dst1_roi, mask_roi));
  195. OCL_ON(cv::add(usrc1_roi, val, udst1_roi, umask_roi));
  196. Near(1e-5);
  197. }
  198. }
  199. //////////////////////////////////////// Subtract //////////////////////////////////////////////
  200. typedef ArithmTestBase Subtract;
  201. OCL_TEST_P(Subtract, Mat)
  202. {
  203. for (int j = 0; j < test_loop_times; j++)
  204. {
  205. generateTestData();
  206. OCL_OFF(cv::subtract(src1_roi, src2_roi, dst1_roi));
  207. OCL_ON(cv::subtract(usrc1_roi, usrc2_roi, udst1_roi));
  208. Near(0);
  209. }
  210. }
  211. OCL_TEST_P(Subtract, Mat_Mask)
  212. {
  213. for (int j = 0; j < test_loop_times; j++)
  214. {
  215. generateTestData();
  216. OCL_OFF(cv::subtract(src1_roi, src2_roi, dst1_roi, mask_roi));
  217. OCL_ON(cv::subtract(usrc1_roi, usrc2_roi, udst1_roi, umask_roi));
  218. Near(0);
  219. }
  220. }
  221. OCL_TEST_P(Subtract, Scalar)
  222. {
  223. for (int j = 0; j < test_loop_times; j++)
  224. {
  225. generateTestData();
  226. OCL_OFF(cv::subtract(val, src1_roi, dst1_roi));
  227. OCL_ON(cv::subtract(val, usrc1_roi, udst1_roi));
  228. Near(1e-5);
  229. }
  230. }
  231. OCL_TEST_P(Subtract, Scalar_Mask)
  232. {
  233. for (int j = 0; j < test_loop_times; j++)
  234. {
  235. generateTestData();
  236. OCL_OFF(cv::subtract(src1_roi, val, dst1_roi, mask_roi));
  237. OCL_ON(cv::subtract(usrc1_roi, val, udst1_roi, umask_roi));
  238. Near(1e-5);
  239. }
  240. }
  241. //////////////////////////////// Mul /////////////////////////////////////////////////
  242. typedef ArithmTestBase Mul;
  243. OCL_TEST_P(Mul, Mat)
  244. {
  245. for (int j = 0; j < test_loop_times; j++)
  246. {
  247. generateTestData();
  248. OCL_OFF(cv::multiply(src1_roi, src2_roi, dst1_roi));
  249. OCL_ON(cv::multiply(usrc1_roi, usrc2_roi, udst1_roi));
  250. Near(0);
  251. }
  252. }
  253. OCL_TEST_P(Mul, Scalar)
  254. {
  255. for (int j = 0; j < test_loop_times; j++)
  256. {
  257. generateTestData();
  258. OCL_OFF(cv::multiply(src1_roi, val, dst1_roi));
  259. OCL_ON(cv::multiply(val, usrc1_roi, udst1_roi));
  260. Near(udst1_roi.depth() >= CV_32F ? 1e-3 : 1);
  261. }
  262. }
  263. OCL_TEST_P(Mul, Mat_Scale)
  264. {
  265. for (int j = 0; j < test_loop_times; j++)
  266. {
  267. generateTestData();
  268. OCL_OFF(cv::multiply(src1_roi, src2_roi, dst1_roi, val[0]));
  269. OCL_ON(cv::multiply(usrc1_roi, usrc2_roi, udst1_roi, val[0]));
  270. if (udst1_roi.depth() >= CV_32F)
  271. #ifdef __ANDROID__
  272. Near(2e-1, true);
  273. #else
  274. Near(1e-3, true);
  275. #endif
  276. else
  277. Near(1);
  278. }
  279. }
  280. OCL_TEST_P(Mul, Mat_Scalar_Scale)
  281. {
  282. for (int j = 0; j < test_loop_times; j++)
  283. {
  284. generateTestData();
  285. OCL_OFF(cv::multiply(src1_roi, val, dst1_roi, val[0]));
  286. OCL_ON(cv::multiply(usrc1_roi, val, udst1_roi, val[0]));
  287. if (udst1_roi.depth() >= CV_32F)
  288. Near(1e-6, true);
  289. else
  290. Near(1);
  291. }
  292. }
  293. //////////////////////////////// Div /////////////////////////////////////////////////
  294. typedef ArithmTestBase Div;
  295. OCL_TEST_P(Div, Mat)
  296. {
  297. for (int j = 0; j < test_loop_times; j++)
  298. {
  299. generateTestData();
  300. OCL_OFF(cv::divide(src1_roi, src2_roi, dst1_roi));
  301. OCL_ON(cv::divide(usrc1_roi, usrc2_roi, udst1_roi));
  302. Near(1);
  303. }
  304. }
  305. OCL_TEST_P(Div, Scalar)
  306. {
  307. for (int j = 0; j < test_loop_times; j++)
  308. {
  309. generateTestData();
  310. OCL_OFF(cv::divide(val, src1_roi, dst1_roi));
  311. OCL_ON(cv::divide(val, usrc1_roi, udst1_roi));
  312. Near(udst1_roi.depth() >= CV_32F ? 1e-3 : 1);
  313. }
  314. }
  315. OCL_TEST_P(Div, Scalar2)
  316. {
  317. for (int j = 0; j < test_loop_times; j++)
  318. {
  319. generateTestData();
  320. OCL_OFF(cv::divide(src1_roi, val, dst1_roi));
  321. OCL_ON(cv::divide(usrc1_roi, val, udst1_roi));
  322. Near(udst1_roi.depth() >= CV_32F ? 1e-3 : 1);
  323. }
  324. }
  325. OCL_TEST_P(Div, Mat_Scale)
  326. {
  327. for (int j = 0; j < test_loop_times; j++)
  328. {
  329. generateTestData();
  330. OCL_OFF(cv::divide(src1_roi, src2_roi, dst1_roi, val[0]));
  331. OCL_ON(cv::divide(usrc1_roi, usrc2_roi, udst1_roi, val[0]));
  332. Near(udst1_roi.depth() >= CV_32F ? 4e-3 : 1);
  333. }
  334. }
  335. OCL_TEST_P(Div, Mat_Scalar_Scale)
  336. {
  337. for (int j = 0; j < test_loop_times; j++)
  338. {
  339. generateTestData();
  340. OCL_OFF(cv::divide(src1_roi, val, dst1_roi, val[0]));
  341. OCL_ON(cv::divide(usrc1_roi, val, udst1_roi, val[0]));
  342. Near(udst1_roi.depth() >= CV_32F ? 4e-3 : 1);
  343. }
  344. }
  345. OCL_TEST_P(Div, Recip)
  346. {
  347. for (int j = 0; j < test_loop_times; j++)
  348. {
  349. generateTestData();
  350. OCL_OFF(cv::divide(val[0], src1_roi, dst1_roi));
  351. OCL_ON(cv::divide(val[0], usrc1_roi, udst1_roi));
  352. Near(udst1_roi.depth() >= CV_32F ? 1e-3 : 1);
  353. }
  354. }
  355. //////////////////////////////// Min/Max /////////////////////////////////////////////////
  356. typedef ArithmTestBase Min;
  357. OCL_TEST_P(Min, Mat)
  358. {
  359. for (int j = 0; j < test_loop_times; j++)
  360. {
  361. generateTestData();
  362. OCL_OFF(cv::min(src1_roi, src2_roi, dst1_roi));
  363. OCL_ON(cv::min(usrc1_roi, usrc2_roi, udst1_roi));
  364. Near(0);
  365. }
  366. }
  367. typedef ArithmTestBase Max;
  368. OCL_TEST_P(Max, Mat)
  369. {
  370. for (int j = 0; j < test_loop_times; j++)
  371. {
  372. generateTestData();
  373. OCL_OFF(cv::max(src1_roi, src2_roi, dst1_roi));
  374. OCL_ON(cv::max(usrc1_roi, usrc2_roi, udst1_roi));
  375. Near(0);
  376. }
  377. }
  378. //////////////////////////////// Absdiff /////////////////////////////////////////////////
  379. typedef ArithmTestBase Absdiff;
  380. OCL_TEST_P(Absdiff, Mat)
  381. {
  382. for (int j = 0; j < test_loop_times; j++)
  383. {
  384. generateTestData();
  385. OCL_OFF(cv::absdiff(src1_roi, src2_roi, dst1_roi));
  386. OCL_ON(cv::absdiff(usrc1_roi, usrc2_roi, udst1_roi));
  387. Near(0);
  388. }
  389. }
  390. OCL_TEST_P(Absdiff, Scalar)
  391. {
  392. for (int j = 0; j < test_loop_times; j++)
  393. {
  394. generateTestData();
  395. OCL_OFF(cv::absdiff(src1_roi, val, dst1_roi));
  396. OCL_ON(cv::absdiff(usrc1_roi, val, udst1_roi));
  397. Near(1e-5);
  398. }
  399. }
  400. //////////////////////////////// CartToPolar /////////////////////////////////////////////////
  401. typedef ArithmTestBase CartToPolar;
  402. OCL_TEST_P(CartToPolar, angleInDegree)
  403. {
  404. for (int j = 0; j < test_loop_times; j++)
  405. {
  406. generateTestData();
  407. OCL_OFF(cv::cartToPolar(src1_roi, src2_roi, dst1_roi, dst2_roi, true));
  408. OCL_ON(cv::cartToPolar(usrc1_roi, usrc2_roi, udst1_roi, udst2_roi, true));
  409. Near(0.5);
  410. Near1(0.5);
  411. }
  412. }
  413. OCL_TEST_P(CartToPolar, angleInRadians)
  414. {
  415. for (int j = 0; j < test_loop_times; j++)
  416. {
  417. generateTestData();
  418. OCL_OFF(cv::cartToPolar(src1_roi, src2_roi, dst1_roi, dst2_roi));
  419. OCL_ON(cv::cartToPolar(usrc1_roi, usrc2_roi, udst1_roi, udst2_roi));
  420. Near(0.5);
  421. Near1(0.5);
  422. }
  423. }
  424. //////////////////////////////// PolarToCart /////////////////////////////////////////////////
  425. typedef ArithmTestBase PolarToCart;
  426. OCL_TEST_P(PolarToCart, angleInDegree)
  427. {
  428. for (int j = 0; j < test_loop_times; j++)
  429. {
  430. generateTestData();
  431. OCL_OFF(cv::polarToCart(src1_roi, src2_roi, dst1_roi, dst2_roi, true));
  432. OCL_ON(cv::polarToCart(usrc1_roi, usrc2_roi, udst1_roi, udst2_roi, true));
  433. Near(0.5);
  434. Near1(0.5);
  435. }
  436. }
  437. OCL_TEST_P(PolarToCart, angleInRadians)
  438. {
  439. for (int j = 0; j < test_loop_times; j++)
  440. {
  441. generateTestData();
  442. OCL_OFF(cv::polarToCart(src1_roi, src2_roi, dst1_roi, dst2_roi));
  443. OCL_ON(cv::polarToCart(usrc1_roi, usrc2_roi, udst1_roi, udst2_roi));
  444. Near(0.5);
  445. Near1(0.5);
  446. }
  447. }
  448. //////////////////////////////// Transpose /////////////////////////////////////////////////
  449. typedef ArithmTestBase Transpose;
  450. OCL_TEST_P(Transpose, Mat)
  451. {
  452. for (int j = 0; j < test_loop_times; j++)
  453. {
  454. generateTestData();
  455. Size roiSize = src1_roi.size();
  456. Border dst1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
  457. randomSubMat(dst1, dst1_roi, Size(roiSize.height, roiSize.width), dst1Border, src1.type(), 5, 16);
  458. UMAT_UPLOAD_INPUT_PARAMETER(dst1);
  459. OCL_OFF(cv::transpose(src1_roi, dst1_roi));
  460. OCL_ON(cv::transpose(usrc1_roi, udst1_roi));
  461. Near(1e-5);
  462. }
  463. }
  464. OCL_TEST_P(Transpose, SquareInplace)
  465. {
  466. const int type = CV_MAKE_TYPE(depth, cn);
  467. for (int j = 0; j < test_loop_times; j++)
  468. {
  469. Size roiSize = randomSize(1, MAX_VALUE);
  470. roiSize.height = roiSize.width; // make it square
  471. Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  472. randomSubMat(src1, src1_roi, roiSize, srcBorder, type, 5, 16);
  473. UMAT_UPLOAD_OUTPUT_PARAMETER(src1);
  474. OCL_OFF(cv::transpose(src1_roi, src1_roi));
  475. OCL_ON(cv::transpose(usrc1_roi, usrc1_roi));
  476. OCL_EXPECT_MATS_NEAR(src1, 0);
  477. }
  478. }
  479. //////////////////////////////// Bitwise_and /////////////////////////////////////////////////
  480. typedef ArithmTestBase Bitwise_and;
  481. OCL_TEST_P(Bitwise_and, Mat)
  482. {
  483. for (int j = 0; j < test_loop_times; j++)
  484. {
  485. generateTestData();
  486. OCL_OFF(cv::bitwise_and(src1_roi, src2_roi, dst1_roi));
  487. OCL_ON(cv::bitwise_and(usrc1_roi, usrc2_roi, udst1_roi));
  488. Near(0);
  489. }
  490. }
  491. OCL_TEST_P(Bitwise_and, Mat_Mask)
  492. {
  493. for (int j = 0; j < test_loop_times; j++)
  494. {
  495. generateTestData();
  496. OCL_OFF(cv::bitwise_and(src1_roi, src2_roi, dst1_roi, mask_roi));
  497. OCL_ON(cv::bitwise_and(usrc1_roi, usrc2_roi, udst1_roi, umask_roi));
  498. Near(0);
  499. }
  500. }
  501. OCL_TEST_P(Bitwise_and, Scalar)
  502. {
  503. for (int j = 0; j < test_loop_times; j++)
  504. {
  505. generateTestData();
  506. OCL_OFF(cv::bitwise_and(src1_roi, val, dst1_roi));
  507. OCL_ON(cv::bitwise_and(usrc1_roi, val, udst1_roi));
  508. Near(1e-5);
  509. }
  510. }
  511. OCL_TEST_P(Bitwise_and, Scalar_Mask)
  512. {
  513. for (int j = 0; j < test_loop_times; j++)
  514. {
  515. generateTestData();
  516. OCL_OFF(cv::bitwise_and(src1_roi, val, dst1_roi, mask_roi));
  517. OCL_ON(cv::bitwise_and(usrc1_roi, val, udst1_roi, umask_roi));
  518. Near(1e-5);
  519. }
  520. }
  521. //////////////////////////////// Bitwise_or /////////////////////////////////////////////////
  522. typedef ArithmTestBase Bitwise_or;
  523. OCL_TEST_P(Bitwise_or, Mat)
  524. {
  525. for (int j = 0; j < test_loop_times; j++)
  526. {
  527. generateTestData();
  528. OCL_OFF(cv::bitwise_or(src1_roi, src2_roi, dst1_roi));
  529. OCL_ON(cv::bitwise_or(usrc1_roi, usrc2_roi, udst1_roi));
  530. Near(0);
  531. }
  532. }
  533. OCL_TEST_P(Bitwise_or, Mat_Mask)
  534. {
  535. for (int j = 0; j < test_loop_times; j++)
  536. {
  537. generateTestData();
  538. OCL_OFF(cv::bitwise_or(src1_roi, src2_roi, dst1_roi, mask_roi));
  539. OCL_ON(cv::bitwise_or(usrc1_roi, usrc2_roi, udst1_roi, umask_roi));
  540. Near(0);
  541. }
  542. }
  543. OCL_TEST_P(Bitwise_or, Scalar)
  544. {
  545. for (int j = 0; j < test_loop_times; j++)
  546. {
  547. generateTestData();
  548. OCL_OFF(cv::bitwise_or(src1_roi, val, dst1_roi));
  549. OCL_ON(cv::bitwise_or(usrc1_roi, val, udst1_roi));
  550. Near(1e-5);
  551. }
  552. }
  553. OCL_TEST_P(Bitwise_or, Scalar_Mask)
  554. {
  555. for (int j = 0; j < test_loop_times; j++)
  556. {
  557. generateTestData();
  558. OCL_OFF(cv::bitwise_or(src1_roi, val, dst1_roi, mask_roi));
  559. OCL_ON(cv::bitwise_or(val, usrc1_roi, udst1_roi, umask_roi));
  560. Near(1e-5);
  561. }
  562. }
  563. //////////////////////////////// Bitwise_xor /////////////////////////////////////////////////
  564. typedef ArithmTestBase Bitwise_xor;
  565. OCL_TEST_P(Bitwise_xor, Mat)
  566. {
  567. for (int j = 0; j < test_loop_times; j++)
  568. {
  569. generateTestData();
  570. OCL_OFF(cv::bitwise_xor(src1_roi, src2_roi, dst1_roi));
  571. OCL_ON(cv::bitwise_xor(usrc1_roi, usrc2_roi, udst1_roi));
  572. Near(0);
  573. }
  574. }
  575. OCL_TEST_P(Bitwise_xor, Mat_Mask)
  576. {
  577. for (int j = 0; j < test_loop_times; j++)
  578. {
  579. generateTestData();
  580. OCL_OFF(cv::bitwise_xor(src1_roi, src2_roi, dst1_roi, mask_roi));
  581. OCL_ON(cv::bitwise_xor(usrc1_roi, usrc2_roi, udst1_roi, umask_roi));
  582. Near(0);
  583. }
  584. }
  585. OCL_TEST_P(Bitwise_xor, Scalar)
  586. {
  587. for (int j = 0; j < test_loop_times; j++)
  588. {
  589. generateTestData();
  590. OCL_OFF(cv::bitwise_xor(src1_roi, val, dst1_roi));
  591. OCL_ON(cv::bitwise_xor(usrc1_roi, val, udst1_roi));
  592. Near(1e-5);
  593. }
  594. }
  595. OCL_TEST_P(Bitwise_xor, Scalar_Mask)
  596. {
  597. for (int j = 0; j < test_loop_times; j++)
  598. {
  599. generateTestData();
  600. OCL_OFF(cv::bitwise_xor(src1_roi, val, dst1_roi, mask_roi));
  601. OCL_ON(cv::bitwise_xor(usrc1_roi, val, udst1_roi, umask_roi));
  602. Near(1e-5);
  603. }
  604. }
  605. //////////////////////////////// Bitwise_not /////////////////////////////////////////////////
  606. typedef ArithmTestBase Bitwise_not;
  607. OCL_TEST_P(Bitwise_not, Mat)
  608. {
  609. for (int j = 0; j < test_loop_times; j++)
  610. {
  611. generateTestData();
  612. OCL_OFF(cv::bitwise_not(src1_roi, dst1_roi));
  613. OCL_ON(cv::bitwise_not(usrc1_roi, udst1_roi));
  614. Near(0);
  615. }
  616. }
  617. //////////////////////////////// Compare /////////////////////////////////////////////////
  618. typedef ArithmTestBase Compare;
  619. static const int cmp_codes[] = { CMP_EQ, CMP_GT, CMP_GE, CMP_LT, CMP_LE, CMP_NE };
  620. static const char * cmp_strs[] = { "CMP_EQ", "CMP_GT", "CMP_GE", "CMP_LT", "CMP_LE", "CMP_NE" };
  621. static const int cmp_num = sizeof(cmp_codes) / sizeof(int);
  622. OCL_TEST_P(Compare, Mat)
  623. {
  624. for (int i = 0; i < cmp_num; ++i)
  625. {
  626. SCOPED_TRACE(cmp_strs[i]);
  627. for (int j = 0; j < test_loop_times; j++)
  628. {
  629. generateTestData();
  630. OCL_OFF(cv::compare(src1_roi, src2_roi, dst1_roi, cmp_codes[i]));
  631. OCL_ON(cv::compare(usrc1_roi, usrc2_roi, udst1_roi, cmp_codes[i]));
  632. Near(0);
  633. }
  634. }
  635. }
  636. OCL_TEST_P(Compare, Scalar)
  637. {
  638. for (int i = 0; i < cmp_num; ++i)
  639. {
  640. SCOPED_TRACE(cmp_strs[i]);
  641. for (int j = 0; j < test_loop_times; j++)
  642. {
  643. generateTestData(true);
  644. OCL_OFF(cv::compare(src1_roi, val_in_range, dst1_roi, cmp_codes[i]));
  645. OCL_ON(cv::compare(usrc1_roi, val_in_range, udst1_roi, cmp_codes[i]));
  646. Near(0);
  647. }
  648. }
  649. }
  650. OCL_TEST_P(Compare, Scalar2)
  651. {
  652. for (int i = 0; i < cmp_num; ++i)
  653. {
  654. SCOPED_TRACE(cmp_strs[i]);
  655. for (int j = 0; j < test_loop_times; j++)
  656. {
  657. generateTestData(true);
  658. OCL_OFF(cv::compare(val_in_range, src1_roi, dst1_roi, cmp_codes[i]));
  659. OCL_ON(cv::compare(val_in_range, usrc1_roi, udst1_roi, cmp_codes[i]));
  660. Near(0);
  661. }
  662. }
  663. }
  664. //////////////////////////////// Pow /////////////////////////////////////////////////
  665. typedef ArithmTestBase Pow;
  666. OCL_TEST_P(Pow, Mat)
  667. {
  668. static const double pows[] = { -4, -1, -2.5, 0, 1, 2, 3.7, 4 };
  669. for (int j = 0; j < 1/*test_loop_times*/; j++)
  670. for (int k = 0, size = sizeof(pows) / sizeof(double); k < size; ++k)
  671. {
  672. SCOPED_TRACE(pows[k]);
  673. generateTestData();
  674. OCL_OFF(cv::pow(src1_roi, pows[k], dst1_roi));
  675. OCL_ON(cv::pow(usrc1_roi, pows[k], udst1_roi));
  676. OCL_EXPECT_MATS_NEAR_RELATIVE(dst1, 1e-5);
  677. }
  678. }
  679. //////////////////////////////// AddWeighted /////////////////////////////////////////////////
  680. typedef ArithmTestBase AddWeighted;
  681. OCL_TEST_P(AddWeighted, Mat)
  682. {
  683. for (int j = 0; j < test_loop_times; j++)
  684. {
  685. generateTestData();
  686. const double alpha = 2.0, beta = 1.0, gama = 3.0;
  687. OCL_OFF(cv::addWeighted(src1_roi, alpha, src2_roi, beta, gama, dst1_roi));
  688. OCL_ON(cv::addWeighted(usrc1_roi, alpha, usrc2_roi, beta, gama, udst1_roi));
  689. if(dst1_roi.depth() >= CV_32F)
  690. Near(3e-4, true);
  691. else
  692. Near(1);
  693. }
  694. }
  695. //////////////////////////////// setIdentity /////////////////////////////////////////////////
  696. typedef ArithmTestBase SetIdentity;
  697. OCL_TEST_P(SetIdentity, Mat)
  698. {
  699. for (int j = 0; j < test_loop_times; j++)
  700. {
  701. generateTestData();
  702. OCL_OFF(cv::setIdentity(dst1_roi, val));
  703. OCL_ON(cv::setIdentity(udst1_roi, val));
  704. Near(0);
  705. }
  706. }
  707. //// Repeat
  708. struct RepeatTestCase :
  709. public ArithmTestBase
  710. {
  711. int nx, ny;
  712. void generateTestData()
  713. {
  714. const int type = CV_MAKE_TYPE(depth, cn);
  715. nx = randomInt(1, 4);
  716. ny = randomInt(1, 4);
  717. Size srcRoiSize = randomSize(1, MAX_VALUE);
  718. Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  719. randomSubMat(src1, src1_roi, srcRoiSize, srcBorder, type, 2, 11);
  720. Size dstRoiSize(srcRoiSize.width * nx, srcRoiSize.height * ny);
  721. Border dst1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
  722. randomSubMat(dst1, dst1_roi, dstRoiSize, dst1Border, type, 5, 16);
  723. UMAT_UPLOAD_INPUT_PARAMETER(src1);
  724. UMAT_UPLOAD_OUTPUT_PARAMETER(dst1);
  725. }
  726. };
  727. typedef RepeatTestCase Repeat;
  728. OCL_TEST_P(Repeat, Mat)
  729. {
  730. for (int i = 0; i < test_loop_times; ++i)
  731. {
  732. generateTestData();
  733. OCL_OFF(cv::repeat(src1_roi, ny, nx, dst1_roi));
  734. OCL_ON(cv::repeat(usrc1_roi, ny, nx, udst1_roi));
  735. Near();
  736. }
  737. }
  738. //////////////////////////////// CountNonZero /////////////////////////////////////////////////
  739. typedef ArithmTestBase CountNonZero;
  740. OCL_TEST_P(CountNonZero, MAT)
  741. {
  742. for (int j = 0; j < test_loop_times; j++)
  743. {
  744. generateTestData();
  745. int cpures, gpures;
  746. OCL_OFF(cpures = cv::countNonZero(src1_roi));
  747. OCL_ON(gpures = cv::countNonZero(usrc1_roi));
  748. EXPECT_EQ(cpures, gpures);
  749. }
  750. }
  751. //////////////////////////////// Sum /////////////////////////////////////////////////
  752. typedef ArithmTestBase Sum;
  753. OCL_TEST_P(Sum, MAT)
  754. {
  755. for (int j = 0; j < test_loop_times; j++)
  756. {
  757. generateTestData();
  758. Scalar cpures, gpures;
  759. OCL_OFF(cpures = cv::sum(src1_roi));
  760. OCL_ON(gpures = cv::sum(usrc1_roi));
  761. for (int i = 0; i < cn; ++i)
  762. EXPECT_NEAR(cpures[i], gpures[i], 0.1);
  763. }
  764. }
  765. //////////////////////////////// meanStdDev /////////////////////////////////////////////////
  766. typedef ArithmTestBase MeanStdDev;
  767. OCL_TEST_P(MeanStdDev, Mat)
  768. {
  769. for (int j = 0; j < test_loop_times; j++)
  770. {
  771. generateTestData();
  772. Scalar cpu_mean, cpu_stddev;
  773. Scalar gpu_mean, gpu_stddev;
  774. OCL_OFF(cv::meanStdDev(src1_roi, cpu_mean, cpu_stddev));
  775. OCL_ON(cv::meanStdDev(usrc1_roi, gpu_mean, gpu_stddev));
  776. for (int i = 0; i < cn; ++i)
  777. {
  778. EXPECT_NEAR(cpu_mean[i], gpu_mean[i], 0.1);
  779. EXPECT_NEAR(cpu_stddev[i], gpu_stddev[i], 0.1);
  780. }
  781. }
  782. }
  783. OCL_TEST_P(MeanStdDev, Mat_Mask)
  784. {
  785. for (int j = 0; j < test_loop_times; j++)
  786. {
  787. generateTestData();
  788. Scalar cpu_mean, cpu_stddev;
  789. Scalar gpu_mean, gpu_stddev;
  790. OCL_OFF(cv::meanStdDev(src1_roi, cpu_mean, cpu_stddev, mask_roi));
  791. OCL_ON(cv::meanStdDev(usrc1_roi, gpu_mean, gpu_stddev, umask_roi));
  792. for (int i = 0; i < cn; ++i)
  793. {
  794. EXPECT_NEAR(cpu_mean[i], gpu_mean[i], 0.1);
  795. EXPECT_NEAR(cpu_stddev[i], gpu_stddev[i], 0.1);
  796. }
  797. }
  798. }
  799. OCL_TEST(MeanStdDev_, ZeroMask)
  800. {
  801. Size size(5, 5);
  802. UMat um(size, CV_32SC1), umask(size, CV_8UC1, Scalar::all(0));
  803. Mat m(size, CV_32SC1), mask(size, CV_8UC1, Scalar::all(0));
  804. Scalar cpu_mean, cpu_stddev;
  805. Scalar gpu_mean, gpu_stddev;
  806. OCL_OFF(cv::meanStdDev(m, cpu_mean, cpu_stddev, mask));
  807. OCL_ON(cv::meanStdDev(um, gpu_mean, gpu_stddev, umask));
  808. for (int i = 0; i < 4; ++i)
  809. {
  810. EXPECT_NEAR(cpu_mean[i], gpu_mean[i], 0.1);
  811. EXPECT_NEAR(cpu_stddev[i], gpu_stddev[i], 0.1);
  812. }
  813. }
  814. //////////////////////////////////////// Log /////////////////////////////////////////
  815. typedef ArithmTestBase Log;
  816. OCL_TEST_P(Log, Mat)
  817. {
  818. for (int j = 0; j < test_loop_times; j++)
  819. {
  820. generateTestData();
  821. OCL_OFF(cv::log(src1_roi, dst1_roi));
  822. OCL_ON(cv::log(usrc1_roi, udst1_roi));
  823. Near(1);
  824. }
  825. }
  826. //////////////////////////////////////// Exp /////////////////////////////////////////
  827. typedef ArithmTestBase Exp;
  828. OCL_TEST_P(Exp, Mat)
  829. {
  830. for (int j = 0; j < test_loop_times; j++)
  831. {
  832. generateTestData();
  833. OCL_OFF(cv::exp(src1_roi, dst1_roi));
  834. OCL_ON(cv::exp(usrc1_roi, udst1_roi));
  835. Near(2);
  836. }
  837. }
  838. //////////////////////////////////////// Phase /////////////////////////////////////////
  839. typedef ArithmTestBase Phase;
  840. OCL_TEST_P(Phase, angleInDegree)
  841. {
  842. for (int j = 0; j < test_loop_times; j++)
  843. {
  844. generateTestData();
  845. OCL_OFF(cv::phase(src1_roi, src2_roi, dst1_roi, true));
  846. OCL_ON(cv::phase(usrc1_roi, usrc2_roi, udst1_roi, true));
  847. Near(1e-2);
  848. }
  849. }
  850. OCL_TEST_P(Phase, angleInRadians)
  851. {
  852. for (int j = 0; j < test_loop_times; j++)
  853. {
  854. generateTestData();
  855. OCL_OFF(cv::phase(src1_roi, src2_roi, dst1_roi));
  856. OCL_ON(cv::phase(usrc1_roi, usrc2_roi, udst1_roi));
  857. Near(1e-2);
  858. }
  859. }
  860. //////////////////////////////////////// Magnitude /////////////////////////////////////////
  861. typedef ArithmTestBase Magnitude;
  862. OCL_TEST_P(Magnitude, Mat)
  863. {
  864. for (int j = 0; j < test_loop_times; j++)
  865. {
  866. generateTestData();
  867. OCL_OFF(cv::magnitude(src1_roi, src2_roi, dst1_roi));
  868. OCL_ON(cv::magnitude(usrc1_roi, usrc2_roi, udst1_roi));
  869. Near(depth == CV_64F ? 1e-5 : 1e-2);
  870. }
  871. }
  872. //////////////////////////////// Flip /////////////////////////////////////////////////
  873. typedef ArithmTestBase Flip;
  874. OCL_TEST_P(Flip, X)
  875. {
  876. for (int j = 0; j < test_loop_times; j++)
  877. {
  878. generateTestData();
  879. OCL_OFF(cv::flip(src1_roi, dst1_roi, 0));
  880. OCL_ON(cv::flip(usrc1_roi, udst1_roi, 0));
  881. Near(0);
  882. }
  883. }
  884. OCL_TEST_P(Flip, Y)
  885. {
  886. for (int j = 0; j < test_loop_times; j++)
  887. {
  888. generateTestData();
  889. OCL_OFF(cv::flip(src1_roi, dst1_roi, 1));
  890. OCL_ON(cv::flip(usrc1_roi, udst1_roi, 1));
  891. Near(0);
  892. }
  893. }
  894. OCL_TEST_P(Flip, BOTH)
  895. {
  896. for (int j = 0; j < test_loop_times; j++)
  897. {
  898. generateTestData();
  899. OCL_OFF(cv::flip(src1_roi, dst1_roi, -1));
  900. OCL_ON(cv::flip(usrc1_roi, udst1_roi, -1));
  901. Near(0);
  902. }
  903. }
  904. //////////////////////////////////////// minMaxIdx /////////////////////////////////////////
  905. typedef ArithmTestBase MinMaxIdx;
  906. OCL_TEST_P(MinMaxIdx, Mat)
  907. {
  908. for (int j = 0; j < test_loop_times; j++)
  909. {
  910. generateTestData();
  911. int p1[2], p2[2], up1[2], up2[2];
  912. double minv, maxv, uminv, umaxv;
  913. if (cn > 1)
  914. {
  915. OCL_OFF(cv::minMaxIdx(src2_roi, &minv, &maxv) );
  916. OCL_ON(cv::minMaxIdx(usrc2_roi, &uminv, &umaxv));
  917. EXPECT_DOUBLE_EQ(minv, uminv);
  918. EXPECT_DOUBLE_EQ(maxv, umaxv);
  919. }
  920. else
  921. {
  922. OCL_OFF(cv::minMaxIdx(src2_roi, &minv, &maxv, p1, p2, noArray()));
  923. OCL_ON(cv::minMaxIdx(usrc2_roi, &uminv, &umaxv, up1, up2, noArray()));
  924. EXPECT_DOUBLE_EQ(minv, uminv);
  925. EXPECT_DOUBLE_EQ(maxv, umaxv);
  926. for (int i = 0; i < 2; i++)
  927. {
  928. EXPECT_EQ(p1[i], up1[i]);
  929. EXPECT_EQ(p2[i], up2[i]);
  930. }
  931. }
  932. }
  933. }
  934. typedef ArithmTestBase MinMaxIdx_Mask;
  935. OCL_TEST_P(MinMaxIdx_Mask, Mat)
  936. {
  937. for (int j = 0; j < test_loop_times; j++)
  938. {
  939. generateTestData();
  940. int p1[2], p2[2], up1[2], up2[2];
  941. double minv, maxv, uminv, umaxv;
  942. OCL_OFF(cv::minMaxIdx(src2_roi, &minv, &maxv, p1, p2, mask_roi));
  943. OCL_ON(cv::minMaxIdx(usrc2_roi, &uminv, &umaxv, up1, up2, umask_roi));
  944. EXPECT_DOUBLE_EQ(minv, uminv);
  945. EXPECT_DOUBLE_EQ(maxv, umaxv);
  946. for( int i = 0; i < 2; i++)
  947. {
  948. EXPECT_EQ(p1[i], up1[i]);
  949. EXPECT_EQ(p2[i], up2[i]);
  950. }
  951. }
  952. }
  953. //////////////////////////////// Norm /////////////////////////////////////////////////
  954. static bool relativeError(double actual, double expected, double eps)
  955. {
  956. return std::abs(actual - expected) < eps*(1 + std::abs(actual));
  957. }
  958. typedef ArithmTestBase Norm;
  959. OCL_TEST_P(Norm, NORM_INF_1arg)
  960. {
  961. for (int j = 0; j < test_loop_times; j++)
  962. {
  963. generateTestData();
  964. OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_INF));
  965. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_INF));
  966. EXPECT_NEAR(cpuRes, gpuRes, 0.1);
  967. }
  968. }
  969. OCL_TEST_P(Norm, NORM_INF_1arg_mask)
  970. {
  971. for (int j = 0; j < test_loop_times; j++)
  972. {
  973. generateTestData();
  974. OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_INF, mask_roi));
  975. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_INF, umask_roi));
  976. EXPECT_NEAR(cpuRes, gpuRes, 0.2);
  977. }
  978. }
  979. OCL_TEST_P(Norm, NORM_L1_1arg)
  980. {
  981. for (int j = 0; j < test_loop_times; j++)
  982. {
  983. generateTestData();
  984. OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_L1));
  985. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_L1));
  986. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
  987. }
  988. }
  989. OCL_TEST_P(Norm, NORM_L1_1arg_mask)
  990. {
  991. for (int j = 0; j < test_loop_times; j++)
  992. {
  993. generateTestData();
  994. OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_L1, mask_roi));
  995. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_L1, umask_roi));
  996. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
  997. }
  998. }
  999. OCL_TEST_P(Norm, NORM_L2_1arg)
  1000. {
  1001. for (int j = 0; j < test_loop_times; j++)
  1002. {
  1003. generateTestData();
  1004. OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_L2));
  1005. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_L2));
  1006. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
  1007. }
  1008. }
  1009. OCL_TEST_P(Norm, NORM_L2_1arg_mask)
  1010. {
  1011. for (int j = 0; j < test_loop_times; j++)
  1012. {
  1013. generateTestData();
  1014. OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_L2, mask_roi));
  1015. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_L2, umask_roi));
  1016. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
  1017. }
  1018. }
  1019. OCL_TEST_P(Norm, NORM_INF_2args)
  1020. {
  1021. for (int relative = 0; relative < 2; ++relative)
  1022. for (int j = 0; j < test_loop_times; j++)
  1023. {
  1024. generateTestData();
  1025. SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
  1026. int type = NORM_INF;
  1027. if (relative == 1)
  1028. type |= NORM_RELATIVE;
  1029. OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type));
  1030. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type));
  1031. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
  1032. }
  1033. }
  1034. OCL_TEST_P(Norm, NORM_INF_2args_mask)
  1035. {
  1036. for (int relative = 0; relative < 2; ++relative)
  1037. for (int j = 0; j < test_loop_times; j++)
  1038. {
  1039. generateTestData();
  1040. SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
  1041. int type = NORM_INF;
  1042. if (relative == 1)
  1043. type |= NORM_RELATIVE;
  1044. OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type, mask_roi));
  1045. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type, umask_roi));
  1046. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
  1047. }
  1048. }
  1049. OCL_TEST_P(Norm, NORM_L1_2args)
  1050. {
  1051. for (int relative = 0; relative < 2; ++relative)
  1052. for (int j = 0; j < test_loop_times; j++)
  1053. {
  1054. generateTestData();
  1055. SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
  1056. int type = NORM_L1;
  1057. if (relative == 1)
  1058. type |= NORM_RELATIVE;
  1059. OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type));
  1060. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type));
  1061. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
  1062. }
  1063. }
  1064. OCL_TEST_P(Norm, NORM_L1_2args_mask)
  1065. {
  1066. for (int relative = 0; relative < 2; ++relative)
  1067. for (int j = 0; j < test_loop_times; j++)
  1068. {
  1069. generateTestData();
  1070. SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
  1071. int type = NORM_L1;
  1072. if (relative == 1)
  1073. type |= NORM_RELATIVE;
  1074. OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type, mask_roi));
  1075. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type, umask_roi));
  1076. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
  1077. }
  1078. }
  1079. OCL_TEST_P(Norm, NORM_L2_2args)
  1080. {
  1081. for (int relative = 0; relative < 2; ++relative)
  1082. for (int j = 0; j < test_loop_times; j++)
  1083. {
  1084. generateTestData();
  1085. SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
  1086. int type = NORM_L2;
  1087. if (relative == 1)
  1088. type |= NORM_RELATIVE;
  1089. OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type));
  1090. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type));
  1091. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
  1092. }
  1093. }
  1094. OCL_TEST_P(Norm, NORM_L2_2args_mask)
  1095. {
  1096. for (int relative = 0; relative < 2; ++relative)
  1097. for (int j = 0; j < test_loop_times; j++)
  1098. {
  1099. generateTestData();
  1100. SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
  1101. int type = NORM_L2;
  1102. if (relative == 1)
  1103. type |= NORM_RELATIVE;
  1104. OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type, mask_roi));
  1105. OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type, umask_roi));
  1106. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
  1107. }
  1108. }
  1109. //////////////////////////////// UMat::dot ////////////////////////////////////////////////
  1110. typedef ArithmTestBase UMatDot;
  1111. OCL_TEST_P(UMatDot, Mat)
  1112. {
  1113. for (int j = 0; j < test_loop_times; j++)
  1114. {
  1115. generateTestData();
  1116. OCL_OFF(const double cpuRes = src1_roi.dot(src2_roi));
  1117. OCL_ON(const double gpuRes = usrc1_roi.dot(usrc2_roi));
  1118. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-5);
  1119. }
  1120. }
  1121. //////////////////////////////// Sqrt ////////////////////////////////////////////////
  1122. typedef ArithmTestBase Sqrt;
  1123. OCL_TEST_P(Sqrt, Mat)
  1124. {
  1125. for (int j = 0; j < test_loop_times; j++)
  1126. {
  1127. generateTestData();
  1128. OCL_OFF(cv::sqrt(src1_roi, dst1_roi));
  1129. OCL_ON(cv::sqrt(usrc1_roi, udst1_roi));
  1130. Near(1);
  1131. }
  1132. }
  1133. //////////////////////////////// Normalize ////////////////////////////////////////////////
  1134. typedef ArithmTestBase Normalize;
  1135. OCL_TEST_P(Normalize, Mat)
  1136. {
  1137. static int modes[] = { CV_MINMAX, CV_L2, CV_L1, CV_C };
  1138. for (int j = 0; j < test_loop_times; j++)
  1139. {
  1140. generateTestData();
  1141. for (int i = 0, size = sizeof(modes) / sizeof(modes[0]); i < size; ++i)
  1142. {
  1143. OCL_OFF(cv::normalize(src1_roi, dst1_roi, 10, 110, modes[i], src1_roi.type(), mask_roi));
  1144. OCL_ON(cv::normalize(usrc1_roi, udst1_roi, 10, 110, modes[i], src1_roi.type(), umask_roi));
  1145. Near(1);
  1146. }
  1147. }
  1148. }
  1149. //////////////////////////////////////// InRange ///////////////////////////////////////////////
  1150. PARAM_TEST_CASE(InRange, MatDepth, Channels, bool /*Scalar or not*/, bool /*Roi*/)
  1151. {
  1152. int depth;
  1153. int cn;
  1154. bool scalars, use_roi;
  1155. cv::Scalar val1, val2;
  1156. TEST_DECLARE_INPUT_PARAMETER(src1);
  1157. TEST_DECLARE_INPUT_PARAMETER(src2);
  1158. TEST_DECLARE_INPUT_PARAMETER(src3);
  1159. TEST_DECLARE_OUTPUT_PARAMETER(dst);
  1160. virtual void SetUp()
  1161. {
  1162. depth = GET_PARAM(0);
  1163. cn = GET_PARAM(1);
  1164. scalars = GET_PARAM(2);
  1165. use_roi = GET_PARAM(3);
  1166. }
  1167. void generateTestData()
  1168. {
  1169. const int type = CV_MAKE_TYPE(depth, cn);
  1170. Size roiSize = randomSize(1, MAX_VALUE);
  1171. Border src1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
  1172. randomSubMat(src1, src1_roi, roiSize, src1Border, type, -40, 40);
  1173. Border src2Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
  1174. randomSubMat(src2, src2_roi, roiSize, src2Border, type, -40, 40);
  1175. Border src3Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
  1176. randomSubMat(src3, src3_roi, roiSize, src3Border, type, -40, 40);
  1177. Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  1178. randomSubMat(dst, dst_roi, roiSize, dstBorder, CV_8UC1, 5, 16);
  1179. val1 = cv::Scalar(rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0),
  1180. rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0));
  1181. val2 = cv::Scalar(rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0),
  1182. rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0));
  1183. UMAT_UPLOAD_INPUT_PARAMETER(src1);
  1184. UMAT_UPLOAD_INPUT_PARAMETER(src2);
  1185. UMAT_UPLOAD_INPUT_PARAMETER(src3);
  1186. UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
  1187. }
  1188. void Near()
  1189. {
  1190. OCL_EXPECT_MATS_NEAR(dst, 0);
  1191. }
  1192. };
  1193. OCL_TEST_P(InRange, Mat)
  1194. {
  1195. for (int j = 0; j < test_loop_times; j++)
  1196. {
  1197. generateTestData();
  1198. OCL_OFF(cv::inRange(src1_roi, src2_roi, src3_roi, dst_roi));
  1199. OCL_ON(cv::inRange(usrc1_roi, usrc2_roi, usrc3_roi, udst_roi));
  1200. Near();
  1201. }
  1202. }
  1203. OCL_TEST_P(InRange, Scalar)
  1204. {
  1205. for (int j = 0; j < test_loop_times; j++)
  1206. {
  1207. generateTestData();
  1208. OCL_OFF(cv::inRange(src1_roi, val1, val2, dst_roi));
  1209. OCL_ON(cv::inRange(usrc1_roi, val1, val2, udst_roi));
  1210. Near();
  1211. }
  1212. }
  1213. //////////////////////////////// ConvertScaleAbs ////////////////////////////////////////////////
  1214. PARAM_TEST_CASE(ConvertScaleAbs, MatDepth, Channels, bool)
  1215. {
  1216. int depth;
  1217. int cn;
  1218. bool use_roi;
  1219. cv::Scalar val;
  1220. TEST_DECLARE_INPUT_PARAMETER(src);
  1221. TEST_DECLARE_OUTPUT_PARAMETER(dst);
  1222. virtual void SetUp()
  1223. {
  1224. depth = GET_PARAM(0);
  1225. cn = GET_PARAM(1);
  1226. use_roi = GET_PARAM(2);
  1227. }
  1228. void generateTestData()
  1229. {
  1230. const int stype = CV_MAKE_TYPE(depth, cn);
  1231. const int dtype = CV_MAKE_TYPE(CV_8U, cn);
  1232. Size roiSize = randomSize(1, MAX_VALUE);
  1233. Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  1234. randomSubMat(src, src_roi, roiSize, srcBorder, stype, -11, 11); // FIXIT: Test with minV, maxV
  1235. Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  1236. randomSubMat(dst, dst_roi, roiSize, dstBorder, dtype, 5, 16);
  1237. val = cv::Scalar(rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0),
  1238. rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0));
  1239. UMAT_UPLOAD_INPUT_PARAMETER(src);
  1240. UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
  1241. }
  1242. void Near(double threshold = 0.)
  1243. {
  1244. OCL_EXPECT_MATS_NEAR(dst, threshold);
  1245. }
  1246. };
  1247. OCL_TEST_P(ConvertScaleAbs, Mat)
  1248. {
  1249. for (int j = 0; j < test_loop_times; j++)
  1250. {
  1251. generateTestData();
  1252. OCL_OFF(cv::convertScaleAbs(src_roi, dst_roi, val[0], val[1]));
  1253. OCL_ON(cv::convertScaleAbs(usrc_roi, udst_roi, val[0], val[1]));
  1254. Near(1);
  1255. }
  1256. }
  1257. //////////////////////////////// ConvertFp16 ////////////////////////////////////////////////
  1258. PARAM_TEST_CASE(ConvertFp16, Channels, bool)
  1259. {
  1260. int cn;
  1261. bool fromHalf;
  1262. cv::Scalar val;
  1263. TEST_DECLARE_INPUT_PARAMETER(src);
  1264. TEST_DECLARE_OUTPUT_PARAMETER(dst);
  1265. virtual void SetUp()
  1266. {
  1267. cn = GET_PARAM(0);
  1268. fromHalf = GET_PARAM(1);
  1269. }
  1270. void generateTestData()
  1271. {
  1272. const int stype = CV_MAKE_TYPE(fromHalf ? CV_32F : CV_16S, cn);
  1273. const int dtype = CV_MAKE_TYPE(fromHalf ? CV_16S : CV_32F, cn);
  1274. Size roiSize = randomSize(1, MAX_VALUE);
  1275. Border srcBorder = randomBorder(0, 0);
  1276. randomSubMat(src, src_roi, roiSize, srcBorder, stype, -11, 11); // FIXIT: Test with minV, maxV
  1277. if (stype == CV_MAKE_TYPE(CV_16S, cn)) // eliminate NaN/Inf FP16 values
  1278. {
  1279. RNG dataRng(rng.next());
  1280. Mat src_i32 = cvtest::randomMat(dataRng, roiSize, CV_MAKE_TYPE(CV_32S, cn), 0, 0x7c00, false);
  1281. Mat shift_i32 = cvtest::randomMat(dataRng, roiSize, src_i32.type(), -1, 1, false); // values: -1, 0
  1282. src_i32 = src_i32 + (shift_i32 * 0x8000);
  1283. src_i32.convertTo(src_roi, stype);
  1284. }
  1285. Border dstBorder = randomBorder(0, 0);
  1286. randomSubMat(dst, dst_roi, roiSize, dstBorder, dtype, 5, 16);
  1287. UMAT_UPLOAD_INPUT_PARAMETER(src);
  1288. UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
  1289. }
  1290. void Near(double threshold = 0.)
  1291. {
  1292. OCL_EXPECT_MATS_NEAR(dst, threshold);
  1293. }
  1294. };
  1295. OCL_TEST_P(ConvertFp16, Mat)
  1296. {
  1297. for (int j = 0; j < test_loop_times; j++)
  1298. {
  1299. generateTestData();
  1300. OCL_OFF(cv::convertFp16(src_roi, dst_roi));
  1301. OCL_ON(cv::convertFp16(usrc_roi, udst_roi));
  1302. Near(1);
  1303. }
  1304. }
  1305. //////////////////////////////// ScaleAdd ////////////////////////////////////////////////
  1306. typedef ArithmTestBase ScaleAdd;
  1307. OCL_TEST_P(ScaleAdd, Mat)
  1308. {
  1309. for (int j = 0; j < test_loop_times; j++)
  1310. {
  1311. generateTestData();
  1312. OCL_OFF(cv::scaleAdd(src1_roi, val[0], src2_roi, dst1_roi));
  1313. OCL_ON(cv::scaleAdd(usrc1_roi, val[0], usrc2_roi, udst1_roi));
  1314. Near(depth <= CV_32S ? 1 : 1e-3);
  1315. }
  1316. }
  1317. //////////////////////////////// PatchNans ////////////////////////////////////////////////
  1318. PARAM_TEST_CASE(PatchNaNs, Channels, bool)
  1319. {
  1320. int cn;
  1321. bool use_roi;
  1322. double value;
  1323. TEST_DECLARE_INPUT_PARAMETER(src);
  1324. virtual void SetUp()
  1325. {
  1326. cn = GET_PARAM(0);
  1327. use_roi = GET_PARAM(1);
  1328. }
  1329. void generateTestData()
  1330. {
  1331. const int type = CV_MAKE_TYPE(CV_32F, cn);
  1332. Size roiSize = randomSize(1, 10);
  1333. Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  1334. randomSubMat(src, src_roi, roiSize, srcBorder, type, -40, 40);
  1335. // generating NaNs
  1336. roiSize.width *= cn;
  1337. for (int y = 0; y < roiSize.height; ++y)
  1338. {
  1339. float * const ptr = src_roi.ptr<float>(y);
  1340. for (int x = 0; x < roiSize.width; ++x)
  1341. ptr[x] = randomInt(-1, 1) == 0 ? std::numeric_limits<float>::quiet_NaN() : ptr[x];
  1342. }
  1343. value = randomDouble(-100, 100);
  1344. UMAT_UPLOAD_INPUT_PARAMETER(src);
  1345. }
  1346. void Near()
  1347. {
  1348. OCL_EXPECT_MATS_NEAR(src, 0);
  1349. }
  1350. };
  1351. OCL_TEST_P(PatchNaNs, Mat)
  1352. {
  1353. for (int j = 0; j < test_loop_times; j++)
  1354. {
  1355. generateTestData();
  1356. OCL_OFF(cv::patchNaNs(src_roi, value));
  1357. OCL_ON(cv::patchNaNs(usrc_roi, value));
  1358. Near();
  1359. }
  1360. }
  1361. //////////////////////////////// Psnr ////////////////////////////////////////////////
  1362. typedef ArithmTestBase Psnr;
  1363. OCL_TEST_P(Psnr, Mat)
  1364. {
  1365. for (int j = 0; j < test_loop_times; j++)
  1366. {
  1367. generateTestData();
  1368. double cpuRes = 0, gpuRes = 0;
  1369. OCL_OFF(cpuRes = cv::PSNR(src1_roi, src2_roi));
  1370. OCL_ON(gpuRes = cv::PSNR(usrc1_roi, usrc2_roi));
  1371. EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
  1372. }
  1373. }
  1374. //////////////////////////////////////// Reduce /////////////////////////////////////////////
  1375. PARAM_TEST_CASE(Reduce, std::pair<MatDepth, MatDepth>, Channels, int, bool)
  1376. {
  1377. int sdepth, ddepth, cn, dim, dtype;
  1378. bool use_roi;
  1379. TEST_DECLARE_INPUT_PARAMETER(src);
  1380. TEST_DECLARE_OUTPUT_PARAMETER(dst);
  1381. virtual void SetUp()
  1382. {
  1383. const std::pair<MatDepth, MatDepth> p = GET_PARAM(0);
  1384. sdepth = p.first;
  1385. ddepth = p.second;
  1386. cn = GET_PARAM(1);
  1387. dim = GET_PARAM(2);
  1388. use_roi = GET_PARAM(3);
  1389. }
  1390. void generateTestData()
  1391. {
  1392. const int stype = CV_MAKE_TYPE(sdepth, cn);
  1393. dtype = CV_MAKE_TYPE(ddepth, cn);
  1394. Size roiSize = randomSize(1, MAX_VALUE);
  1395. Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  1396. randomSubMat(src, src_roi, roiSize, srcBorder, stype, -40, 40);
  1397. Size dstRoiSize = Size(dim == 0 ? roiSize.width : 1, dim == 0 ? 1 : roiSize.height);
  1398. Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
  1399. randomSubMat(dst, dst_roi, dstRoiSize, dstBorder, dtype, 5, 16);
  1400. UMAT_UPLOAD_INPUT_PARAMETER(src);
  1401. UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
  1402. }
  1403. };
  1404. typedef Reduce ReduceSum;
  1405. OCL_TEST_P(ReduceSum, Mat)
  1406. {
  1407. for (int j = 0; j < test_loop_times; j++)
  1408. {
  1409. generateTestData();
  1410. OCL_OFF(cv::reduce(src_roi, dst_roi, dim, REDUCE_SUM, dtype));
  1411. OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, REDUCE_SUM, dtype));
  1412. double eps = ddepth <= CV_32S ? 1 : 7e-4;
  1413. OCL_EXPECT_MATS_NEAR(dst, eps);
  1414. }
  1415. }
  1416. typedef Reduce ReduceMax;
  1417. OCL_TEST_P(ReduceMax, Mat)
  1418. {
  1419. for (int j = 0; j < test_loop_times; j++)
  1420. {
  1421. generateTestData();
  1422. OCL_OFF(cv::reduce(src_roi, dst_roi, dim, REDUCE_MAX, dtype));
  1423. OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, REDUCE_MAX, dtype));
  1424. OCL_EXPECT_MATS_NEAR(dst, 0);
  1425. }
  1426. }
  1427. typedef Reduce ReduceMin;
  1428. OCL_TEST_P(ReduceMin, Mat)
  1429. {
  1430. for (int j = 0; j < test_loop_times; j++)
  1431. {
  1432. generateTestData();
  1433. OCL_OFF(cv::reduce(src_roi, dst_roi, dim, REDUCE_MIN, dtype));
  1434. OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, REDUCE_MIN, dtype));
  1435. OCL_EXPECT_MATS_NEAR(dst, 0);
  1436. }
  1437. }
  1438. typedef Reduce ReduceAvg;
  1439. OCL_TEST_P(ReduceAvg, Mat)
  1440. {
  1441. for (int j = 0; j < test_loop_times; j++)
  1442. {
  1443. generateTestData();
  1444. OCL_OFF(cv::reduce(src_roi, dst_roi, dim, REDUCE_AVG, dtype));
  1445. OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, REDUCE_AVG, dtype));
  1446. double eps = ddepth <= CV_32S ? 1 : 6e-6;
  1447. OCL_EXPECT_MATS_NEAR(dst, eps);
  1448. }
  1449. }
  1450. //////////////////////////////////////// Instantiation /////////////////////////////////////////
  1451. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Lut, Combine(::testing::Values(CV_8U, CV_8S), OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool(), Bool()));
  1452. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Add, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1453. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Subtract, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1454. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Mul, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1455. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Div, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1456. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Min, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1457. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Max, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1458. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Absdiff, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1459. OCL_INSTANTIATE_TEST_CASE_P(Arithm, CartToPolar, Combine(testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
  1460. OCL_INSTANTIATE_TEST_CASE_P(Arithm, PolarToCart, Combine(testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
  1461. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Transpose, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1462. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_and, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1463. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_not, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1464. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_xor, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1465. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_or, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1466. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Pow, Combine(testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
  1467. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Compare, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1468. OCL_INSTANTIATE_TEST_CASE_P(Arithm, AddWeighted, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1469. OCL_INSTANTIATE_TEST_CASE_P(Arithm, SetIdentity, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1470. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Repeat, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1471. OCL_INSTANTIATE_TEST_CASE_P(Arithm, CountNonZero, Combine(OCL_ALL_DEPTHS, testing::Values(Channels(1)), Bool()));
  1472. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Sum, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1473. OCL_INSTANTIATE_TEST_CASE_P(Arithm, MeanStdDev, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1474. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Log, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
  1475. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Exp, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
  1476. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Phase, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
  1477. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Magnitude, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
  1478. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Flip, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1479. OCL_INSTANTIATE_TEST_CASE_P(Arithm, MinMaxIdx, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1480. OCL_INSTANTIATE_TEST_CASE_P(Arithm, MinMaxIdx_Mask, Combine(OCL_ALL_DEPTHS, ::testing::Values(Channels(1)), Bool()));
  1481. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Norm, Combine(OCL_ALL_DEPTHS_16F, OCL_ALL_CHANNELS, Bool()));
  1482. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Sqrt, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
  1483. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Normalize, Combine(OCL_ALL_DEPTHS, Values(Channels(1)), Bool()));
  1484. OCL_INSTANTIATE_TEST_CASE_P(Arithm, InRange, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool(), Bool()));
  1485. OCL_INSTANTIATE_TEST_CASE_P(Arithm, ConvertScaleAbs, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1486. OCL_INSTANTIATE_TEST_CASE_P(Arithm, ConvertFp16, Combine(OCL_ALL_CHANNELS, Bool()));
  1487. OCL_INSTANTIATE_TEST_CASE_P(Arithm, ScaleAdd, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1488. OCL_INSTANTIATE_TEST_CASE_P(Arithm, PatchNaNs, Combine(OCL_ALL_CHANNELS, Bool()));
  1489. OCL_INSTANTIATE_TEST_CASE_P(Arithm, Psnr, Combine(::testing::Values((MatDepth)CV_8U), OCL_ALL_CHANNELS, Bool()));
  1490. OCL_INSTANTIATE_TEST_CASE_P(Arithm, UMatDot, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
  1491. OCL_INSTANTIATE_TEST_CASE_P(Arithm, ReduceSum, Combine(testing::Values(std::make_pair<MatDepth, MatDepth>(CV_8U, CV_32S),
  1492. std::make_pair<MatDepth, MatDepth>(CV_8U, CV_32F),
  1493. std::make_pair<MatDepth, MatDepth>(CV_8U, CV_64F),
  1494. std::make_pair<MatDepth, MatDepth>(CV_16U, CV_32F),
  1495. std::make_pair<MatDepth, MatDepth>(CV_16U, CV_64F),
  1496. std::make_pair<MatDepth, MatDepth>(CV_16S, CV_32F),
  1497. std::make_pair<MatDepth, MatDepth>(CV_16S, CV_64F),
  1498. std::make_pair<MatDepth, MatDepth>(CV_32F, CV_32F),
  1499. std::make_pair<MatDepth, MatDepth>(CV_32F, CV_64F),
  1500. std::make_pair<MatDepth, MatDepth>(CV_64F, CV_64F)),
  1501. OCL_ALL_CHANNELS, testing::Values(0, 1), Bool()));
  1502. OCL_INSTANTIATE_TEST_CASE_P(Arithm, ReduceAvg, Combine(testing::Values(std::make_pair<MatDepth, MatDepth>(CV_8U, CV_32S),
  1503. std::make_pair<MatDepth, MatDepth>(CV_8U, CV_32F),
  1504. std::make_pair<MatDepth, MatDepth>(CV_8U, CV_64F),
  1505. std::make_pair<MatDepth, MatDepth>(CV_16U, CV_32F),
  1506. std::make_pair<MatDepth, MatDepth>(CV_16U, CV_64F),
  1507. std::make_pair<MatDepth, MatDepth>(CV_16S, CV_32F),
  1508. std::make_pair<MatDepth, MatDepth>(CV_16S, CV_64F),
  1509. std::make_pair<MatDepth, MatDepth>(CV_32F, CV_32F),
  1510. std::make_pair<MatDepth, MatDepth>(CV_32F, CV_64F),
  1511. std::make_pair<MatDepth, MatDepth>(CV_64F, CV_64F)),
  1512. OCL_ALL_CHANNELS, testing::Values(0, 1), Bool()));
  1513. OCL_INSTANTIATE_TEST_CASE_P(Arithm, ReduceMax, Combine(testing::Values(std::make_pair<MatDepth, MatDepth>(CV_8U, CV_8U),
  1514. std::make_pair<MatDepth, MatDepth>(CV_16U, CV_16U),
  1515. std::make_pair<MatDepth, MatDepth>(CV_16S, CV_16S),
  1516. std::make_pair<MatDepth, MatDepth>(CV_32F, CV_32F),
  1517. std::make_pair<MatDepth, MatDepth>(CV_64F, CV_64F)),
  1518. OCL_ALL_CHANNELS, testing::Values(0, 1), Bool()));
  1519. OCL_INSTANTIATE_TEST_CASE_P(Arithm, ReduceMin, Combine(testing::Values(std::make_pair<MatDepth, MatDepth>(CV_8U, CV_8U),
  1520. std::make_pair<MatDepth, MatDepth>(CV_16U, CV_16U),
  1521. std::make_pair<MatDepth, MatDepth>(CV_16S, CV_16S),
  1522. std::make_pair<MatDepth, MatDepth>(CV_32F, CV_32F),
  1523. std::make_pair<MatDepth, MatDepth>(CV_64F, CV_64F)),
  1524. OCL_ALL_CHANNELS, testing::Values(0, 1), Bool()));
  1525. // T-API BUG (haveOpenCL() is false): modules/core/src/matrix.cpp:212: error: (-215) u->refcount == 0 in function deallocate
  1526. OCL_TEST(Normalize, DISABLED_regression_5876_inplace_change_type)
  1527. {
  1528. double initial_values[] = {1, 2, 5, 4, 3};
  1529. float result_values[] = {0, 0.25, 1, 0.75, 0.5};
  1530. Mat m(Size(5, 1), CV_64FC1, initial_values);
  1531. Mat result(Size(5, 1), CV_32FC1, result_values);
  1532. UMat um; m.copyTo(um);
  1533. UMat uresult; result.copyTo(uresult);
  1534. OCL_ON(normalize(um, um, 1, 0, NORM_MINMAX, CV_32F));
  1535. EXPECT_EQ(0, cvtest::norm(um, uresult, NORM_INF));
  1536. }
  1537. } } // namespace opencv_test::ocl
  1538. #endif // HAVE_OPENCL