gapi_fluid_test_kernels.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  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. #include "test_precomp.hpp"
  7. #include <iomanip>
  8. #include <vector>
  9. #include "gapi_fluid_test_kernels.hpp"
  10. #include <opencv2/gapi/core.hpp>
  11. #include <opencv2/gapi/own/saturate.hpp>
  12. namespace cv
  13. {
  14. namespace gapi_test_kernels
  15. {
  16. GAPI_FLUID_KERNEL(FAddSimple, TAddSimple, false)
  17. {
  18. static const int Window = 1;
  19. static void run(const cv::gapi::fluid::View &a,
  20. const cv::gapi::fluid::View &b,
  21. cv::gapi::fluid::Buffer &o)
  22. {
  23. // std::cout << "AddSimple {{{\n";
  24. // std::cout << " a - "; a.debug(std::cout);
  25. // std::cout << " b - "; b.debug(std::cout);
  26. // std::cout << " o - "; o.debug(std::cout);
  27. const uint8_t* in1 = a.InLine<uint8_t>(0);
  28. const uint8_t* in2 = b.InLine<uint8_t>(0);
  29. uint8_t* out = o.OutLine<uint8_t>();
  30. // std::cout << "a: ";
  31. // for (int i = 0, w = a.length(); i < w; i++)
  32. // {
  33. // std::cout << std::setw(4) << int(in1[i]);
  34. // }
  35. // std::cout << "\n";
  36. // std::cout << "b: ";
  37. // for (int i = 0, w = a.length(); i < w; i++)
  38. // {
  39. // std::cout << std::setw(4) << int(in2[i]);
  40. // }
  41. // std::cout << "\n";
  42. for (int i = 0, w = a.length(); i < w; i++)
  43. {
  44. out[i] = in1[i] + in2[i];
  45. }
  46. // std::cout << "}}} " << std::endl;;
  47. }
  48. };
  49. GAPI_FLUID_KERNEL(FAddCSimple, TAddCSimple, false)
  50. {
  51. static const int Window = 1;
  52. static const int LPI = 2;
  53. static void run(const cv::gapi::fluid::View &in,
  54. const int cval,
  55. cv::gapi::fluid::Buffer &out)
  56. {
  57. for (int l = 0, lpi = out.lpi(); l < lpi; l++)
  58. {
  59. const uint8_t* in_row = in .InLine <uint8_t>(l);
  60. uint8_t* out_row = out.OutLine<uint8_t>(l);
  61. //std::cout << "l=" << l << ": ";
  62. for (int i = 0, w = in.length(); i < w; i++)
  63. {
  64. //std::cout << std::setw(4) << int(in_row[i]);
  65. //FIXME: it seems that over kernels might need it as well
  66. out_row[i] = cv::gapi::own::saturate<uint8_t>(in_row[i] + cval);
  67. }
  68. //std::cout << std::endl;
  69. }
  70. }
  71. };
  72. GAPI_FLUID_KERNEL(FAddScalar, TAddScalar, false)
  73. {
  74. static const int Window = 1;
  75. static const int LPI = 2;
  76. static void run(const cv::gapi::fluid::View &in,
  77. const cv::Scalar &cval,
  78. cv::gapi::fluid::Buffer &out)
  79. {
  80. for (int l = 0, lpi = out.lpi(); l < lpi; l++)
  81. {
  82. const uint8_t* in_row = in .InLine <uint8_t>(l);
  83. uint8_t* out_row = out.OutLine<uint8_t>(l);
  84. std::cout << "l=" << l << ": ";
  85. for (int i = 0, w = in.length(); i < w; i++)
  86. {
  87. std::cout << std::setw(4) << int(in_row[i]);
  88. out_row[i] = static_cast<uint8_t>(in_row[i] + cval[0]);
  89. }
  90. std::cout << std::endl;
  91. }
  92. }
  93. };
  94. GAPI_FLUID_KERNEL(FAddScalarToMat, TAddScalarToMat, false)
  95. {
  96. static const int Window = 1;
  97. static const int LPI = 2;
  98. static void run(const cv::Scalar &cval,
  99. const cv::gapi::fluid::View &in,
  100. cv::gapi::fluid::Buffer &out)
  101. {
  102. for (int l = 0, lpi = out.lpi(); l < lpi; l++)
  103. {
  104. const uint8_t* in_row = in .InLine <uint8_t>(l);
  105. uint8_t* out_row = out.OutLine<uint8_t>(l);
  106. std::cout << "l=" << l << ": ";
  107. for (int i = 0, w = in.length(); i < w; i++)
  108. {
  109. std::cout << std::setw(4) << int(in_row[i]);
  110. out_row[i] = static_cast<uint8_t>(in_row[i] + cval[0]);
  111. }
  112. std::cout << std::endl;
  113. }
  114. }
  115. };
  116. template<int kernelSize, int lpi = 1>
  117. static void runBlur(const cv::gapi::fluid::View& src, cv::gapi::fluid::Buffer& dst)
  118. {
  119. const auto borderSize = (kernelSize - 1) / 2;
  120. const unsigned char* ins[kernelSize];
  121. for (int l = 0; l < lpi; l++)
  122. {
  123. for (int i = 0; i < kernelSize; i++)
  124. {
  125. ins[i] = src.InLine<unsigned char>(i - borderSize + l);
  126. }
  127. auto out = dst.OutLine<unsigned char>(l);
  128. const auto width = dst.length();
  129. for (int w = 0; w < width; w++)
  130. {
  131. float res = 0.0f;
  132. for (int i = 0; i < kernelSize; i++)
  133. {
  134. for (int j = -borderSize; j < borderSize + 1; j++)
  135. {
  136. res += ins[i][w+j];
  137. }
  138. }
  139. out[w] = static_cast<unsigned char>(std::rint(res / (kernelSize * kernelSize)));
  140. }
  141. }
  142. }
  143. GAPI_FLUID_KERNEL(FBlur1x1, TBlur1x1, false)
  144. {
  145. static const int Window = 1;
  146. static void run(const cv::gapi::fluid::View &src, int /*borderType*/,
  147. cv::Scalar /*borderValue*/, cv::gapi::fluid::Buffer &dst)
  148. {
  149. runBlur<Window>(src, dst);
  150. }
  151. };
  152. GAPI_FLUID_KERNEL(FBlur3x3, TBlur3x3, false)
  153. {
  154. static const int Window = 3;
  155. static void run(const cv::gapi::fluid::View &src, int /*borderType*/,
  156. cv::Scalar /*borderValue*/, cv::gapi::fluid::Buffer &dst)
  157. {
  158. runBlur<Window>(src, dst);
  159. }
  160. static cv::gapi::fluid::Border getBorder(const cv::GMatDesc &/*src*/, int borderType, cv::Scalar borderValue)
  161. {
  162. return { borderType, borderValue};
  163. }
  164. };
  165. GAPI_FLUID_KERNEL(FBlur5x5, TBlur5x5, false)
  166. {
  167. static const int Window = 5;
  168. static void run(const cv::gapi::fluid::View &src, int /*borderType*/,
  169. cv::Scalar /*borderValue*/, cv::gapi::fluid::Buffer &dst)
  170. {
  171. runBlur<Window>(src, dst);
  172. }
  173. static cv::gapi::fluid::Border getBorder(const cv::GMatDesc &/*src*/, int borderType, cv::Scalar borderValue)
  174. {
  175. return { borderType, borderValue};
  176. }
  177. };
  178. GAPI_FLUID_KERNEL(FBlur3x3_2lpi, TBlur3x3_2lpi, false)
  179. {
  180. static const int Window = 3;
  181. static const int LPI = 2;
  182. static void run(const cv::gapi::fluid::View &src, int /*borderType*/,
  183. cv::Scalar /*borderValue*/, cv::gapi::fluid::Buffer &dst)
  184. {
  185. runBlur<Window, LPI>(src, dst);
  186. }
  187. static cv::gapi::fluid::Border getBorder(const cv::GMatDesc &/*src*/, int borderType, cv::Scalar borderValue)
  188. {
  189. return { borderType, borderValue};
  190. }
  191. };
  192. GAPI_FLUID_KERNEL(FBlur5x5_2lpi, TBlur5x5_2lpi, false)
  193. {
  194. static const int Window = 5;
  195. static const int LPI = 2;
  196. static void run(const cv::gapi::fluid::View &src, int /*borderType*/,
  197. cv::Scalar /*borderValue*/, cv::gapi::fluid::Buffer &dst)
  198. {
  199. runBlur<Window, LPI>(src, dst);
  200. }
  201. static cv::gapi::fluid::Border getBorder(const cv::GMatDesc &/*src*/, int borderType, cv::Scalar borderValue)
  202. {
  203. return { borderType, borderValue};
  204. }
  205. };
  206. GAPI_FLUID_KERNEL(FIdentity, TId, false)
  207. {
  208. static const int Window = 3;
  209. static void run(const cv::gapi::fluid::View &a,
  210. cv::gapi::fluid::Buffer &o)
  211. {
  212. const uint8_t* in[3] = {
  213. a.InLine<uint8_t>(-1),
  214. a.InLine<uint8_t>( 0),
  215. a.InLine<uint8_t>(+1)
  216. };
  217. uint8_t* out = o.OutLine<uint8_t>();
  218. // ReadFunction3x3(in, a.length());
  219. for (int i = 0, w = a.length(); i < w; i++)
  220. {
  221. out[i] = in[1][i];
  222. }
  223. }
  224. static gapi::fluid::Border getBorder(const cv::GMatDesc &)
  225. {
  226. return { cv::BORDER_REPLICATE, cv::Scalar{} };
  227. }
  228. };
  229. GAPI_FLUID_KERNEL(FId7x7, TId7x7, false)
  230. {
  231. static const int Window = 7;
  232. static const int LPI = 2;
  233. static void run(const cv::gapi::fluid::View &a,
  234. cv::gapi::fluid::Buffer &o)
  235. {
  236. for (int l = 0, lpi = o.lpi(); l < lpi; l++)
  237. {
  238. const uint8_t* in[Window] = {
  239. a.InLine<uint8_t>(-3 + l),
  240. a.InLine<uint8_t>(-2 + l),
  241. a.InLine<uint8_t>(-1 + l),
  242. a.InLine<uint8_t>( 0 + l),
  243. a.InLine<uint8_t>(+1 + l),
  244. a.InLine<uint8_t>(+2 + l),
  245. a.InLine<uint8_t>(+3 + l),
  246. };
  247. uint8_t* out = o.OutLine<uint8_t>(l);
  248. // std::cout << "Id7x7 " << l << " of " << lpi << " {{{\n";
  249. // std::cout << " a - "; a.debug(std::cout);
  250. // std::cout << " o - "; o.debug(std::cout);
  251. // std::cout << "}}} " << std::endl;;
  252. // // std::cout << "Id7x7 at " << a.y() << "/L" << l << " {{{" << std::endl;
  253. // for (int j = 0; j < Window; j++)
  254. // {
  255. // // std::cout << std::setw(2) << j-(Window-1)/2 << ": ";
  256. // for (int i = 0, w = a.length(); i < w; i++)
  257. // std::cout << std::setw(4) << int(in[j][i]);
  258. // std::cout << std::endl;
  259. // }
  260. // std::cout << "}}}" << std::endl;
  261. for (int i = 0, w = a.length(); i < w; i++)
  262. out[i] = in[(Window-1)/2][i];
  263. }
  264. }
  265. static cv::gapi::fluid::Border getBorder(const cv::GMatDesc&/* src*/)
  266. {
  267. return { cv::BORDER_REPLICATE, cv::Scalar{} };
  268. }
  269. };
  270. GAPI_FLUID_KERNEL(FPlusRow0, TPlusRow0, true)
  271. {
  272. static const int Window = 1;
  273. static void initScratch(const cv::GMatDesc &in,
  274. cv::gapi::fluid::Buffer &scratch)
  275. {
  276. cv::Size scratch_size{in.size.width, 1};
  277. cv::gapi::fluid::Buffer buffer(in.withSize(scratch_size));
  278. scratch = std::move(buffer);
  279. }
  280. static void resetScratch(cv::gapi::fluid::Buffer &scratch)
  281. {
  282. // FIXME: only 1 line can be used!
  283. uint8_t* out_row = scratch.OutLine<uint8_t>();
  284. for (int i = 0, w = scratch.length(); i < w; i++)
  285. {
  286. out_row[i] = 0;
  287. }
  288. }
  289. static void run(const cv::gapi::fluid::View &in,
  290. cv::gapi::fluid::Buffer &out,
  291. cv::gapi::fluid::Buffer &scratch)
  292. {
  293. const uint8_t* in_row = in .InLine <uint8_t>(0);
  294. uint8_t* out_row = out .OutLine<uint8_t>();
  295. uint8_t* tmp_row = scratch.OutLine<uint8_t>();
  296. if (in.y() == 0)
  297. {
  298. // Copy 1st row to scratch buffer
  299. for (int i = 0, w = in.length(); i < w; i++)
  300. {
  301. out_row[i] = in_row[i];
  302. tmp_row[i] = in_row[i];
  303. }
  304. }
  305. else
  306. {
  307. // Output is 1st row + in
  308. for (int i = 0, w = in.length(); i < w; i++)
  309. {
  310. out_row[i] = in_row[i] + tmp_row[i];
  311. }
  312. }
  313. }
  314. };
  315. static void split3Row(const cv::gapi::fluid::View &in,
  316. cv::gapi::fluid::Buffer &o1,
  317. cv::gapi::fluid::Buffer &o2,
  318. cv::gapi::fluid::Buffer &o3)
  319. {
  320. for (int l = 0; l < o1.lpi(); l++)
  321. {
  322. // std::cout << "Split3 {{{\n";
  323. // std::cout << " a - "; in.debug(std::cout);
  324. // std::cout << " 1 - "; o1.debug(std::cout);
  325. // std::cout << " 2 - "; o2.debug(std::cout);
  326. // std::cout << " 3 - "; o3.debug(std::cout);
  327. // std::cout << "}}} " << std::endl;;
  328. const uint8_t* in_rgb = in.InLine<uint8_t>(l);
  329. uint8_t* out_r = o1.OutLine<uint8_t>(l);
  330. uint8_t* out_g = o2.OutLine<uint8_t>(l);
  331. uint8_t* out_b = o3.OutLine<uint8_t>(l);
  332. for (int i = 0, w = in.length(); i < w; i++)
  333. {
  334. out_r[i] = in_rgb[3*i];
  335. out_g[i] = in_rgb[3*i+1];
  336. out_b[i] = in_rgb[3*i+2];
  337. }
  338. }
  339. }
  340. GAPI_FLUID_KERNEL(FTestSplit3, cv::gapi::core::GSplit3, false)
  341. {
  342. static const int Window = 1;
  343. static void run(const cv::gapi::fluid::View &in,
  344. cv::gapi::fluid::Buffer &o1,
  345. cv::gapi::fluid::Buffer &o2,
  346. cv::gapi::fluid::Buffer &o3)
  347. {
  348. split3Row(in, o1, o2, o3);
  349. }
  350. };
  351. GAPI_FLUID_KERNEL(FTestSplit3_4lpi, TSplit3_4lpi, false)
  352. {
  353. static const int Window = 1;
  354. static const int LPI = 4;
  355. static void run(const cv::gapi::fluid::View &in,
  356. cv::gapi::fluid::Buffer &o1,
  357. cv::gapi::fluid::Buffer &o2,
  358. cv::gapi::fluid::Buffer &o3)
  359. {
  360. split3Row(in, o1, o2, o3);
  361. }
  362. };
  363. std::tuple<GMat, GMat, GMat> split3_4lpi(const GMat& src)
  364. {
  365. return TSplit3_4lpi::on(src);
  366. }
  367. GAPI_FLUID_KERNEL(FSum2MatsAndScalar, TSum2MatsAndScalar, false)
  368. {
  369. static const int Window = 1;
  370. static const int LPI = 2;
  371. static void run(const cv::gapi::fluid::View &a,
  372. const cv::Scalar &cval,
  373. const cv::gapi::fluid::View &b,
  374. cv::gapi::fluid::Buffer &out)
  375. {
  376. for (int l = 0, lpi = out.lpi(); l < lpi; l++)
  377. {
  378. const uint8_t* in_row1 = a .InLine <uint8_t>(l);
  379. const uint8_t* in_row2 = b .InLine <uint8_t>(l);
  380. uint8_t* out_row = out.OutLine<uint8_t>(l);
  381. std::cout << "l=" << l << ": ";
  382. for (int i = 0, w = a.length(); i < w; i++)
  383. {
  384. std::cout << std::setw(4) << int(in_row1[i]);
  385. std::cout << std::setw(4) << int(in_row2[i]);
  386. out_row[i] = static_cast<uint8_t>(in_row1[i] + in_row2[i] + cval[0]);
  387. }
  388. std::cout << std::endl;
  389. }
  390. }
  391. };
  392. GAPI_FLUID_KERNEL(FEqualizeHist, TEqualizeHist, false)
  393. {
  394. static const int Window = 1;
  395. static const int LPI = 2;
  396. static void run(const cv::gapi::fluid::View &mat,
  397. const std::vector<int> &arr,
  398. cv::gapi::fluid::Buffer &out)
  399. {
  400. for (int l = 0, lpi = out.lpi(); l < lpi; l++)
  401. {
  402. const uint8_t* in_row = mat.InLine <uint8_t>(l);
  403. uint8_t* out_row = out.OutLine<uint8_t>(l);
  404. for (int i = 0, w = mat.length(); i < w; i++)
  405. {
  406. out_row[i] = static_cast<uint8_t>(arr[in_row[i]]);
  407. }
  408. }
  409. }
  410. };
  411. GAPI_OCV_KERNEL(OCVCalcHist, TCalcHist)
  412. {
  413. static void run(const cv::Mat& in, std::vector<int>& out)
  414. {
  415. out = std::vector<int>(256, 0);
  416. // Calculate normalized accumulated integral transformation array for gapi
  417. for(int i = 0; i < in.rows; ++i)
  418. for(int j = 0; j < in.cols; ++j)
  419. ++out[in.at<uint8_t>(i, j)];
  420. for(unsigned int i = 1; i < out.size(); ++i)
  421. out[i] += out[i-1];
  422. int size = in.size().width * in.size().height;
  423. int min = size;
  424. for(unsigned int i = 0; i < out.size(); ++i)
  425. if(out[i] != 0 && out[i] < min)
  426. min = out[i];
  427. for(auto & el : out)
  428. {
  429. // General histogram equalization formula
  430. el = cvRound(((float)(el - min) / (float)(size - min))*255);
  431. }
  432. }
  433. };
  434. static const int ITUR_BT_601_CY = 1220542;
  435. static const int ITUR_BT_601_CUB = 2116026;
  436. static const int ITUR_BT_601_CUG = -409993;
  437. static const int ITUR_BT_601_CVG = -852492;
  438. static const int ITUR_BT_601_CVR = 1673527;
  439. static const int ITUR_BT_601_SHIFT = 20;
  440. static inline void uvToRGBuv(const uchar u, const uchar v, int& ruv, int& guv, int& buv)
  441. {
  442. int uu, vv;
  443. uu = int(u) - 128;
  444. vv = int(v) - 128;
  445. ruv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVR * vv;
  446. guv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVG * vv + ITUR_BT_601_CUG * uu;
  447. buv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CUB * uu;
  448. }
  449. static inline void yRGBuvToRGB(const uchar vy, const int ruv, const int guv, const int buv,
  450. uchar& r, uchar& g, uchar& b)
  451. {
  452. int y = std::max(0, vy - 16) * ITUR_BT_601_CY;
  453. r = saturate_cast<uchar>((y + ruv) >> ITUR_BT_601_SHIFT);
  454. g = saturate_cast<uchar>((y + guv) >> ITUR_BT_601_SHIFT);
  455. b = saturate_cast<uchar>((y + buv) >> ITUR_BT_601_SHIFT);
  456. }
  457. GAPI_FLUID_KERNEL(FNV12toRGB, cv::gapi::imgproc::GNV12toRGB, false)
  458. {
  459. static const int Window = 1;
  460. static const int LPI = 2;
  461. static const auto Kind = GFluidKernel::Kind::YUV420toRGB;
  462. static void run(const cv::gapi::fluid::View &in1,
  463. const cv::gapi::fluid::View &in2,
  464. cv::gapi::fluid::Buffer &out)
  465. {
  466. const auto w = out.length();
  467. GAPI_Assert(w % 2 == 0);
  468. GAPI_Assert(out.lpi() == 2);
  469. const uchar* uv_row = in2.InLineB(0);
  470. const uchar* y_rows[] = {in1. InLineB(0), in1. InLineB(1)};
  471. uchar* out_rows[] = {out.OutLineB(0), out.OutLineB(1)};
  472. for (int i = 0; i < w/2; i++)
  473. {
  474. uchar u = uv_row[2*i];
  475. uchar v = uv_row[2*i + 1];
  476. int ruv, guv, buv;
  477. uvToRGBuv(u, v, ruv, guv, buv);
  478. for (int y = 0; y < 2; y++)
  479. {
  480. for (int x = 0; x < 2; x++)
  481. {
  482. uchar vy = y_rows[y][2*i + x];
  483. uchar r, g, b;
  484. yRGBuvToRGB(vy, ruv, guv, buv, r, g, b);
  485. out_rows[y][3*(2*i + x)] = r;
  486. out_rows[y][3*(2*i + x) + 1] = g;
  487. out_rows[y][3*(2*i + x) + 2] = b;
  488. }
  489. }
  490. }
  491. }
  492. };
  493. GAPI_FLUID_KERNEL(FMerge3_4lpi, TMerge3_4lpi, false)
  494. {
  495. static const int Window = 1;
  496. static const int LPI = 4;
  497. static void run(const cv::gapi::fluid::View &src1,
  498. const cv::gapi::fluid::View &src2,
  499. const cv::gapi::fluid::View &src3,
  500. cv::gapi::fluid::Buffer &dst)
  501. {
  502. for (int l = 0; l < dst.lpi(); l++)
  503. {
  504. const auto *in1 = src1.InLine<uchar>(l);
  505. const auto *in2 = src2.InLine<uchar>(l);
  506. const auto *in3 = src3.InLine<uchar>(l);
  507. auto *out = dst.OutLine<uchar>(l);
  508. for (int w = 0; w < dst.length(); w++)
  509. {
  510. out[3*w ] = in1[w];
  511. out[3*w + 1] = in2[w];
  512. out[3*w + 2] = in3[w];
  513. }
  514. }
  515. }
  516. };
  517. GMat merge3_4lpi(const GMat& src1, const GMat& src2, const GMat& src3)
  518. {
  519. return TMerge3_4lpi::on(src1, src2, src3);
  520. }
  521. cv::GKernelPackage fluidTestPackage = cv::gapi::kernels
  522. <FAddSimple
  523. ,FAddCSimple
  524. ,FAddScalar
  525. ,FAddScalarToMat
  526. ,FBlur1x1
  527. ,FBlur3x3
  528. ,FBlur5x5
  529. ,FBlur3x3_2lpi
  530. ,FBlur5x5_2lpi
  531. ,FIdentity
  532. ,FId7x7
  533. ,FMerge3_4lpi
  534. ,FNV12toRGB
  535. ,FPlusRow0
  536. ,FSum2MatsAndScalar
  537. ,FTestSplit3
  538. ,FTestSplit3_4lpi
  539. ,FEqualizeHist
  540. ,OCVCalcHist
  541. >();
  542. } // namespace gapi_test_kernels
  543. } // namespace cv