010df5dff75b0f01f7c3ab3e7ad8c9837f672aa2
[platform/upstream/opencv.git] / modules / gapi / test / render / gapi_render_tests_ocv.cpp
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
7
8 #ifdef HAVE_FREETYPE
9 #include <codecvt>
10 #endif // HAVE_FREETYPE
11
12 #include "../test_precomp.hpp"
13 #include "../common/gapi_render_tests.hpp"
14
15 #include "api/render_priv.hpp"
16
17 namespace opencv_test
18 {
19
20 #ifdef HAVE_FREETYPE
21 GAPI_RENDER_TEST_FIXTURES(OCVTestFTexts,    FIXTURE_API(std::wstring, cv::Point, int, cv::Scalar),                        4, text, org, fh, color)
22 #endif // HAVE_FREETYPE
23
24 GAPI_RENDER_TEST_FIXTURES(OCVTestTexts,     FIXTURE_API(std::string, cv::Point, int, double, cv::Scalar, int, int, bool), 8, text, org, ff, fs, color, thick, lt, blo)
25 GAPI_RENDER_TEST_FIXTURES(OCVTestRects,     FIXTURE_API(cv::Rect, cv::Scalar, int, int, int),                             5, rect, color, thick, lt, shift)
26 GAPI_RENDER_TEST_FIXTURES(OCVTestCircles,   FIXTURE_API(cv::Point, int, cv::Scalar, int, int, int),                       6, center, radius, color, thick, lt, shift)
27 GAPI_RENDER_TEST_FIXTURES(OCVTestLines,     FIXTURE_API(cv::Point, cv::Point, cv::Scalar, int, int, int),                 6, pt1, pt2, color, thick, lt, shift)
28 GAPI_RENDER_TEST_FIXTURES(OCVTestMosaics,   FIXTURE_API(cv::Rect, int, int),                                              3, mos, cellsz, decim)
29 GAPI_RENDER_TEST_FIXTURES(OCVTestImages,    FIXTURE_API(cv::Rect, cv::Scalar, double),                                    3, rect, color, transparency)
30 GAPI_RENDER_TEST_FIXTURES(OCVTestPolylines, FIXTURE_API(Points, cv::Scalar, int, int, int),                               5, points, color, thick, lt, shift)
31
32 TEST_P(RenderBGROCVTestTexts, AccuracyTest)
33 {
34     // G-API code //////////////////////////////////////////////////////////////
35     cv::gapi::wip::draw::Prims prims;
36     prims.emplace_back(cv::gapi::wip::draw::Text{text, org, ff, fs, color, thick, lt, blo});
37     cv::gapi::wip::draw::render(gapi_mat, prims);
38
39     // OpenCV code //////////////////////////////////////////////////////////////
40     {
41         cv::putText(ref_mat, text, org, ff, fs, color, thick, lt, blo);
42     }
43
44     // Comparison //////////////////////////////////////////////////////////////
45     {
46         EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
47     }
48 }
49
50 TEST_P(RenderNV12OCVTestTexts, AccuracyTest)
51 {
52     // G-API code //////////////////////////////////////////////////////////////
53     cv::gapi::wip::draw::Prims prims;
54     prims.emplace_back(cv::gapi::wip::draw::Text{text, org, ff, fs, color, thick, lt, blo});
55     cv::gapi::wip::draw::render(y_gapi_mat, uv_gapi_mat, prims);
56
57     // OpenCV code //////////////////////////////////////////////////////////////
58     {
59         // NV12 -> YUV
60         cv::Mat yuv;
61         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
62
63         cv::putText(yuv, text, org, ff, fs, cvtBGRToYUVC(color), thick, lt, blo);
64
65         // YUV -> NV12
66         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
67     }
68
69     // Comparison //////////////////////////////////////////////////////////////
70     {
71         EXPECT_EQ(0, cv::norm(y_gapi_mat,  y_ref_mat));
72         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
73     }
74 }
75
76 class TestMediaNV12 final : public cv::MediaFrame::IAdapter {
77     cv::Mat m_y;
78     cv::Mat m_uv;
79 public:
80     TestMediaNV12(cv::Mat y, cv::Mat uv) : m_y(y), m_uv(uv) {
81     }
82     cv::GFrameDesc meta() const override {
83         return cv::GFrameDesc{ cv::MediaFormat::NV12, cv::Size(m_y.cols, m_y.rows) };
84     }
85     cv::MediaFrame::View access(cv::MediaFrame::Access) override {
86         cv::MediaFrame::View::Ptrs pp = {
87             m_y.ptr(), m_uv.ptr(), nullptr, nullptr
88         };
89         cv::MediaFrame::View::Strides ss = {
90             m_y.step, m_uv.step, 0u, 0u
91         };
92         return cv::MediaFrame::View(std::move(pp), std::move(ss));
93     }
94 };
95
96 TEST_P(RenderMFrameOCVTestTexts, AccuracyTest)
97 {
98     // G-API code //////////////////////////////////////////////////////////////
99     cv::gapi::wip::draw::Prims prims;
100     prims.emplace_back(cv::gapi::wip::draw::Text{ text, org, ff, fs, color, thick, lt, blo });
101     cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
102     cv::gapi::wip::draw::render(nv12, prims);
103
104     // OpenCV code //////////////////////////////////////////////////////////////
105     {
106         // NV12 -> YUV
107         cv::Mat yuv;
108         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
109
110         cv::putText(yuv, text, org, ff, fs, cvtBGRToYUVC(color), thick, lt, blo);
111
112         // YUV -> NV12
113         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
114     }
115
116     // Comparison //////////////////////////////////////////////////////////////
117     {
118         EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
119         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
120     }
121 }
122
123
124 # ifdef HAVE_FREETYPE
125
126 TEST_P(RenderBGROCVTestFTexts, AccuracyTest)
127 {
128     // G-API code //////////////////////////////////////////////////////////////
129     cv::gapi::wip::draw::Prims prims;
130     prims.emplace_back(cv::gapi::wip::draw::FText{text, org, fh, color});
131     EXPECT_NO_THROW(cv::gapi::wip::draw::render(gapi_mat, prims,
132                                 cv::compile_args(cv::gapi::wip::draw::freetype_font{
133                                 "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
134                                 })));
135 }
136
137 TEST_P(RenderNV12OCVTestFTexts, AccuracyTest)
138 {
139     // G-API code //////////////////////////////////////////////////////////////
140     cv::gapi::wip::draw::Prims prims;
141     prims.emplace_back(cv::gapi::wip::draw::FText{text, org, fh, color});
142     EXPECT_NO_THROW(cv::gapi::wip::draw::render(y_gapi_mat, uv_gapi_mat, prims,
143                                 cv::compile_args(cv::gapi::wip::draw::freetype_font{
144                                 "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
145                                 })));
146 }
147
148 TEST_P(RenderMFrameOCVTestFTexts, AccuracyTest)
149 {
150     // G-API code //////////////////////////////////////////////////////////////
151     cv::Mat y_copy_mat = y_gapi_mat.clone();
152     cv::Mat uv_copy_mat = uv_gapi_mat.clone();
153     cv::gapi::wip::draw::Prims prims;
154     prims.emplace_back(cv::gapi::wip::draw::FText{ text, org, fh, color });
155     cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
156     EXPECT_NO_THROW(cv::gapi::wip::draw::render(nv12, prims,
157         cv::compile_args(cv::gapi::wip::draw::freetype_font{
158         "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
159             })));
160     EXPECT_NE(0, cv::norm(y_gapi_mat, y_copy_mat));
161     EXPECT_NE(0, cv::norm(uv_gapi_mat, uv_copy_mat));
162 }
163
164
165 static std::wstring to_wstring(const char* bytes)
166 {
167     std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
168     return converter.from_bytes(bytes);
169 }
170
171 TEST(RenderFText, FontsNotPassedToCompileArgs)
172 {
173     cv::Mat in_mat(640, 480, CV_8UC3, cv::Scalar::all(0));
174
175     std::wstring text = to_wstring("\xe4\xbd\xa0\xe5\xa5\xbd");
176     cv::Point org(100, 100);
177     int fh = 60;
178     cv::Scalar color(200, 100, 25);
179
180     cv::gapi::wip::draw::Prims prims;
181     prims.emplace_back(cv::gapi::wip::draw::FText{text, org, fh, color});
182
183     EXPECT_ANY_THROW(cv::gapi::wip::draw::render(in_mat, prims));
184 }
185
186 #endif // HAVE_FREETYPE
187
188 TEST_P(RenderBGROCVTestRects, AccuracyTest)
189 {
190     // G-API code //////////////////////////////////////////////////////////////
191     cv::gapi::wip::draw::Prims prims;
192     prims.emplace_back(cv::gapi::wip::draw::Rect{rect, color, thick, lt, shift});
193     cv::gapi::wip::draw::render(gapi_mat, prims);
194
195     // OpenCV code //////////////////////////////////////////////////////////////
196     {
197         cv::rectangle(ref_mat, rect, color, thick, lt, shift);
198     }
199
200     // Comparison //////////////////////////////////////////////////////////////
201     {
202         EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
203     }
204 }
205
206 TEST_P(RenderNV12OCVTestRects, AccuracyTest)
207 {
208     // G-API code //////////////////////////////////////////////////////////////
209     cv::gapi::wip::draw::Prims prims;
210     prims.emplace_back(cv::gapi::wip::draw::Rect{rect, color, thick, lt, shift});
211     cv::gapi::wip::draw::render(y_gapi_mat, uv_gapi_mat, prims);
212
213     // OpenCV code //////////////////////////////////////////////////////////////
214     {
215         // NV12 -> YUV
216         cv::Mat yuv;
217         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
218
219         cv::rectangle(yuv, rect, cvtBGRToYUVC(color), thick, lt, shift);
220
221         // YUV -> NV12
222         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
223     }
224
225     // Comparison //////////////////////////////////////////////////////////////
226     {
227         EXPECT_EQ(0, cv::norm(y_gapi_mat,  y_ref_mat));
228         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
229     }
230 }
231
232 TEST_P(RenderMFrameOCVTestRects, AccuracyTest)
233 {
234     // G-API code //////////////////////////////////////////////////////////////
235     cv::gapi::wip::draw::Prims prims;
236     prims.emplace_back(cv::gapi::wip::draw::Rect{ rect, color, thick, lt, shift });
237     cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
238     cv::gapi::wip::draw::render(nv12, prims);
239
240     // OpenCV code //////////////////////////////////////////////////////////////
241     {
242         // NV12 -> YUV
243         cv::Mat yuv;
244         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
245
246         cv::rectangle(yuv, rect, cvtBGRToYUVC(color), thick, lt, shift);
247
248         // YUV -> NV12
249         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
250     }
251
252     // Comparison //////////////////////////////////////////////////////////////
253     {
254         EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
255         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
256     }
257 }
258
259 TEST_P(RenderBGROCVTestCircles, AccuracyTest)
260 {
261     // G-API code //////////////////////////////////////////////////////////////
262     cv::gapi::wip::draw::Prims prims;
263     prims.emplace_back(cv::gapi::wip::draw::Circle{center, radius, color, thick, lt, shift});
264     cv::gapi::wip::draw::render(gapi_mat, prims);
265
266     // OpenCV code //////////////////////////////////////////////////////////////
267     {
268         cv::circle(ref_mat, center, radius, color, thick, lt, shift);
269     }
270
271     // Comparison //////////////////////////////////////////////////////////////
272     {
273         EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
274     }
275 }
276
277 TEST_P(RenderNV12OCVTestCircles, AccuracyTest)
278 {
279     // G-API code //////////////////////////////////////////////////////////////
280     cv::gapi::wip::draw::Prims prims;
281     prims.emplace_back(cv::gapi::wip::draw::Circle{center, radius, color, thick, lt, shift});
282     cv::gapi::wip::draw::render(y_gapi_mat, uv_gapi_mat, prims);
283
284     // OpenCV code //////////////////////////////////////////////////////////////
285     {
286         // NV12 -> YUV
287         cv::Mat yuv;
288         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
289
290         cv::circle(yuv, center, radius, cvtBGRToYUVC(color), thick, lt, shift);
291
292         // YUV -> NV12
293         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
294     }
295
296     // Comparison //////////////////////////////////////////////////////////////
297     {
298         EXPECT_EQ(0, cv::norm(y_gapi_mat,  y_ref_mat));
299         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
300     }
301 }
302
303 TEST_P(RenderMFrameOCVTestCircles, AccuracyTest)
304 {
305     // G-API code //////////////////////////////////////////////////////////////
306     cv::gapi::wip::draw::Prims prims;
307     prims.emplace_back(cv::gapi::wip::draw::Circle{ center, radius, color, thick, lt, shift });
308     cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
309     cv::gapi::wip::draw::render(nv12, prims);
310
311     // OpenCV code //////////////////////////////////////////////////////////////
312     {
313         // NV12 -> YUV
314         cv::Mat yuv;
315         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
316
317         cv::circle(yuv, center, radius, cvtBGRToYUVC(color), thick, lt, shift);
318
319         // YUV -> NV12
320         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
321     }
322
323     // Comparison //////////////////////////////////////////////////////////////
324     {
325         EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
326         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
327     }
328 }
329
330 TEST_P(RenderBGROCVTestLines, AccuracyTest)
331 {
332     // G-API code //////////////////////////////////////////////////////////////
333     cv::gapi::wip::draw::Prims prims;
334     prims.emplace_back(cv::gapi::wip::draw::Line{pt1, pt2, color, thick, lt, shift});
335     cv::gapi::wip::draw::render(gapi_mat, prims);
336
337     // OpenCV code //////////////////////////////////////////////////////////////
338     {
339         cv::line(ref_mat, pt1, pt2, color, thick, lt, shift);
340     }
341
342     // Comparison //////////////////////////////////////////////////////////////
343     {
344         EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
345     }
346 }
347
348 TEST_P(RenderNV12OCVTestLines, AccuracyTest)
349 {
350     // G-API code //////////////////////////////////////////////////////////////
351     cv::gapi::wip::draw::Prims prims;
352     prims.emplace_back(cv::gapi::wip::draw::Line{pt1, pt2, color, thick, lt, shift});
353     cv::gapi::wip::draw::render(y_gapi_mat, uv_gapi_mat, prims);
354
355     // OpenCV code //////////////////////////////////////////////////////////////
356     {
357         // NV12 -> YUV
358         cv::Mat yuv;
359         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
360
361         cv::line(yuv, pt1, pt2, cvtBGRToYUVC(color), thick, lt, shift);
362
363         // YUV -> NV12
364         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
365     }
366
367     // Comparison //////////////////////////////////////////////////////////////
368     {
369         EXPECT_EQ(0, cv::norm(y_gapi_mat,  y_ref_mat));
370         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
371     }
372 }
373
374 TEST_P(RenderMFrameOCVTestLines, AccuracyTest)
375 {
376     // G-API code //////////////////////////////////////////////////////////////
377     cv::gapi::wip::draw::Prims prims;
378     prims.emplace_back(cv::gapi::wip::draw::Line{ pt1, pt2, color, thick, lt, shift });
379     cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
380     cv::gapi::wip::draw::render(nv12, prims);
381
382     // OpenCV code //////////////////////////////////////////////////////////////
383     {
384         // NV12 -> YUV
385         cv::Mat yuv;
386         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
387
388         cv::line(yuv, pt1, pt2, cvtBGRToYUVC(color), thick, lt, shift);
389
390         // YUV -> NV12
391         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
392     }
393
394     // Comparison //////////////////////////////////////////////////////////////
395     {
396         EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
397         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
398     }
399 }
400
401 TEST_P(RenderBGROCVTestMosaics, AccuracyTest)
402 {
403     // G-API code //////////////////////////////////////////////////////////////
404     cv::gapi::wip::draw::Prims prims;
405     prims.emplace_back(cv::gapi::wip::draw::Mosaic{mos, cellsz, decim});
406     cv::gapi::wip::draw::render(gapi_mat, prims);
407
408     // OpenCV code //////////////////////////////////////////////////////////////
409     {
410         drawMosaicRef(ref_mat, mos, cellsz);
411     }
412
413     // Comparison //////////////////////////////////////////////////////////////
414     {
415         EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
416     }
417 }
418
419 TEST_P(RenderNV12OCVTestMosaics, AccuracyTest)
420 {
421     // G-API code //////////////////////////////////////////////////////////////
422     cv::gapi::wip::draw::Prims prims;
423     prims.emplace_back(cv::gapi::wip::draw::Mosaic{mos, cellsz, decim});
424     cv::gapi::wip::draw::render(y_gapi_mat, uv_gapi_mat, prims);
425
426     // OpenCV code //////////////////////////////////////////////////////////////
427     {
428         // NV12 -> YUV
429         cv::Mat yuv;
430         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
431
432         drawMosaicRef(yuv, mos, cellsz);
433
434         // YUV -> NV12
435         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
436     }
437
438     // Comparison //////////////////////////////////////////////////////////////
439     {
440         EXPECT_EQ(0, cv::norm(y_gapi_mat,  y_ref_mat));
441         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
442     }
443 }
444
445 TEST_P(RenderMFrameOCVTestMosaics, AccuracyTest)
446 {
447     // G-API code //////////////////////////////////////////////////////////////
448     cv::gapi::wip::draw::Prims prims;
449     prims.emplace_back(cv::gapi::wip::draw::Mosaic{ mos, cellsz, decim });
450     cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
451     cv::gapi::wip::draw::render(nv12, prims);
452
453     // OpenCV code //////////////////////////////////////////////////////////////
454     {
455         // NV12 -> YUV
456         cv::Mat yuv;
457         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
458
459         drawMosaicRef(yuv, mos, cellsz);
460
461         // YUV -> NV12
462         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
463     }
464
465     // Comparison //////////////////////////////////////////////////////////////
466     {
467         EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
468         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
469     }
470 }
471
472 TEST_P(RenderBGROCVTestImages, AccuracyTest)
473 {
474     cv::Mat img(rect.size(), CV_8UC3, color);
475     cv::Mat alpha(rect.size(), CV_32FC1, transparency);
476     auto tl = rect.tl();
477     cv::Point org = {tl.x, tl.y + rect.size().height};
478
479     // G-API code //////////////////////////////////////////////////////////////
480     cv::gapi::wip::draw::Prims prims;
481     prims.emplace_back(cv::gapi::wip::draw::Image{org, img, alpha});
482     cv::gapi::wip::draw::render(gapi_mat, prims);
483
484     // OpenCV code //////////////////////////////////////////////////////////////
485     {
486         blendImageRef(ref_mat, org, img, alpha);
487     }
488
489     // Comparison //////////////////////////////////////////////////////////////
490     {
491         EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
492     }
493 }
494
495 TEST_P(RenderNV12OCVTestImages, AccuracyTest)
496 {
497     cv::Mat img(rect.size(), CV_8UC3, color);
498     cv::Mat alpha(rect.size(), CV_32FC1, transparency);
499     auto tl = rect.tl();
500     cv::Point org = {tl.x, tl.y + rect.size().height};
501
502     // G-API code //////////////////////////////////////////////////////////////
503     cv::gapi::wip::draw::Prims prims;
504     prims.emplace_back(cv::gapi::wip::draw::Image{org, img, alpha});
505     cv::gapi::wip::draw::render(y_gapi_mat, uv_gapi_mat, prims);
506
507     // OpenCV code //////////////////////////////////////////////////////////////
508     {
509         // NV12 -> YUV
510         cv::Mat yuv;
511         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
512
513         cv::Mat yuv_img;
514         cv::cvtColor(img, yuv_img, cv::COLOR_BGR2YUV);
515         blendImageRef(yuv, org, yuv_img, alpha);
516
517         // YUV -> NV12
518         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
519     }
520
521     // Comparison //////////////////////////////////////////////////////////////
522     {
523         EXPECT_EQ(0, cv::norm(y_gapi_mat,  y_ref_mat));
524         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
525     }
526 }
527
528 TEST_P(RenderMFrameOCVTestImages, AccuracyTest)
529 {
530     cv::Mat img(rect.size(), CV_8UC3, color);
531     cv::Mat alpha(rect.size(), CV_32FC1, transparency);
532     auto tl = rect.tl();
533     cv::Point org = { tl.x, tl.y + rect.size().height };
534
535     // G-API code //////////////////////////////////////////////////////////////
536     cv::gapi::wip::draw::Prims prims;
537     prims.emplace_back(cv::gapi::wip::draw::Image{ org, img, alpha });
538     cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
539     cv::gapi::wip::draw::render(nv12, prims);
540
541     // OpenCV code //////////////////////////////////////////////////////////////
542     {
543         // NV12 -> YUV
544         cv::Mat yuv;
545         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
546
547         cv::Mat yuv_img;
548         cv::cvtColor(img, yuv_img, cv::COLOR_BGR2YUV);
549         blendImageRef(yuv, org, yuv_img, alpha);
550
551         // YUV -> NV12
552         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
553     }
554
555     // Comparison //////////////////////////////////////////////////////////////
556     {
557         EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
558         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
559     }
560 }
561
562 TEST_P(RenderBGROCVTestPolylines, AccuracyTest)
563 {
564     // G-API code //////////////////////////////////////////////////////////////
565     cv::gapi::wip::draw::Prims prims;
566     prims.emplace_back(cv::gapi::wip::draw::Poly{points, color, thick, lt, shift});
567     cv::gapi::wip::draw::render(gapi_mat, prims);
568
569     // OpenCV code //////////////////////////////////////////////////////////////
570     {
571         std::vector<std::vector<cv::Point>> array_points{points};
572         cv::fillPoly(ref_mat, array_points, color, lt, shift);
573     }
574
575     // Comparison //////////////////////////////////////////////////////////////
576     {
577         EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
578     }
579 }
580
581 TEST_P(RenderNV12OCVTestPolylines, AccuracyTest)
582 {
583     // G-API code //////////////////////////////////////////////////////////////
584     cv::gapi::wip::draw::Prims prims;
585     prims.emplace_back(cv::gapi::wip::draw::Poly{points, color, thick, lt, shift});
586     cv::gapi::wip::draw::render(y_gapi_mat, uv_gapi_mat, prims);
587
588     // OpenCV code //////////////////////////////////////////////////////////////
589     {
590         // NV12 -> YUV
591         cv::Mat yuv;
592         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
593
594         std::vector<std::vector<cv::Point>> pp{points};
595         cv::fillPoly(yuv, pp, cvtBGRToYUVC(color), lt, shift);
596
597         // YUV -> NV12
598         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
599     }
600
601     // Comparison //////////////////////////////////////////////////////////////
602     {
603         EXPECT_EQ(0, cv::norm(y_gapi_mat,  y_ref_mat));
604         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
605     }
606 }
607
608 TEST_P(RenderMFrameOCVTestPolylines, AccuracyTest)
609 {
610     // G-API code //////////////////////////////////////////////////////////////
611     cv::gapi::wip::draw::Prims prims;
612     prims.emplace_back(cv::gapi::wip::draw::Poly{ points, color, thick, lt, shift });
613     cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
614     cv::gapi::wip::draw::render(nv12, prims);
615
616     // OpenCV code //////////////////////////////////////////////////////////////
617     {
618         // NV12 -> YUV
619         cv::Mat yuv;
620         cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
621
622         std::vector<std::vector<cv::Point>> pp{ points };
623         cv::fillPoly(yuv, pp, cvtBGRToYUVC(color), lt, shift);
624
625         // YUV -> NV12
626         cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
627     }
628
629     // Comparison //////////////////////////////////////////////////////////////
630     {
631         EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
632         EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
633     }
634 }
635
636 // FIXME avoid code duplicate for NV12 and BGR cases
637 INSTANTIATE_TEST_CASE_P(RenderBGROCVTestRectsImpl, RenderBGROCVTestRects,
638                         Combine(Values(cv::Size(1280, 720)),
639                                 Values(cv::Rect(100, 100, 200, 200)),
640                                 Values(cv::Scalar(100, 50, 150)),
641                                 Values(2),
642                                 Values(LINE_8),
643                                 Values(0)));
644
645 INSTANTIATE_TEST_CASE_P(RenderNV12OCVTestRectsImpl, RenderNV12OCVTestRects,
646                         Combine(Values(cv::Size(1280, 720)),
647                                        Values(cv::Rect(100, 100, 200, 200)),
648                                        Values(cv::Scalar(100, 50, 150)),
649                                        Values(2),
650                                        Values(LINE_8),
651                                        Values(0)));
652
653 INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestRectsImpl, RenderMFrameOCVTestRects,
654                         Combine(Values(cv::Size(1280, 720)),
655                                 Values(cv::Rect(100, 100, 200, 200)),
656                                 Values(cv::Scalar(100, 50, 150)),
657                                 Values(2),
658                                 Values(LINE_8),
659                                 Values(0)));
660
661 INSTANTIATE_TEST_CASE_P(RenderBGROCVTestCirclesImpl, RenderBGROCVTestCircles,
662                         Combine(Values(cv::Size(1280, 720)),
663                                 Values(cv::Point(100, 100)),
664                                 Values(10),
665                                 Values(cv::Scalar(100, 50, 150)),
666                                 Values(2),
667                                 Values(LINE_8),
668                                 Values(0)));
669
670 INSTANTIATE_TEST_CASE_P(RenderNV12OCVTestCirclesImpl, RenderNV12OCVTestCircles,
671                         Combine(Values(cv::Size(1280, 720)),
672                                 Values(cv::Point(100, 100)),
673                                 Values(10),
674                                 Values(cv::Scalar(100, 50, 150)),
675                                 Values(2),
676                                 Values(LINE_8),
677                                 Values(0)));
678
679 INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestCirclesImpl, RenderMFrameOCVTestCircles,
680                         Combine(Values(cv::Size(1280, 720)),
681                                 Values(cv::Point(100, 100)),
682                                 Values(10),
683                                 Values(cv::Scalar(100, 50, 150)),
684                                 Values(2),
685                                 Values(LINE_8),
686                                 Values(0)));
687
688 INSTANTIATE_TEST_CASE_P(RenderBGROCVTestLinesImpl, RenderBGROCVTestLines,
689                         Combine(Values(cv::Size(1280, 720)),
690                                 Values(cv::Point(100, 100)),
691                                 Values(cv::Point(200, 200)),
692                                 Values(cv::Scalar(100, 50, 150)),
693                                 Values(2),
694                                 Values(LINE_8),
695                                 Values(0)));
696
697 INSTANTIATE_TEST_CASE_P(RenderNV12OCVTestLinesImpl, RenderNV12OCVTestLines,
698                         Combine(Values(cv::Size(1280, 720)),
699                                 Values(cv::Point(100, 100)),
700                                 Values(cv::Point(200, 200)),
701                                 Values(cv::Scalar(100, 50, 150)),
702                                 Values(2),
703                                 Values(LINE_8),
704                                 Values(0)));
705
706 INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestLinesImpl, RenderMFrameOCVTestLines,
707                         Combine(Values(cv::Size(1280, 720)),
708                                 Values(cv::Point(100, 100)),
709                                 Values(cv::Point(200, 200)),
710                                 Values(cv::Scalar(100, 50, 150)),
711                                 Values(2),
712                                 Values(LINE_8),
713                                 Values(0)));
714
715 INSTANTIATE_TEST_CASE_P(RenderBGROCVTestTextsImpl, RenderBGROCVTestTexts,
716                         Combine(Values(cv::Size(1280, 720)),
717                                 Values("SomeText"),
718                                 Values(cv::Point(200, 200)),
719                                 Values(FONT_HERSHEY_SIMPLEX),
720                                 Values(2.0),
721                                 Values(cv::Scalar(0, 255, 0)),
722                                 Values(2),
723                                 Values(LINE_8),
724                                 Values(false)));
725
726 INSTANTIATE_TEST_CASE_P(RenderNV12OCVTestTextsImpl, RenderNV12OCVTestTexts,
727                         Combine(Values(cv::Size(1280, 720)),
728                                 Values("SomeText"),
729                                 Values(cv::Point(200, 200)),
730                                 Values(FONT_HERSHEY_SIMPLEX),
731                                 Values(2.0),
732                                 Values(cv::Scalar(0, 255, 0)),
733                                 Values(2),
734                                 Values(LINE_8),
735                                 Values(false)));
736
737 INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestTextsImpl, RenderMFrameOCVTestTexts,
738                         Combine(Values(cv::Size(1280, 720)),
739                                 Values("SomeText"),
740                                 Values(cv::Point(200, 200)),
741                                 Values(FONT_HERSHEY_SIMPLEX),
742                                 Values(2.0),
743                                 Values(cv::Scalar(0, 255, 0)),
744                                 Values(2),
745                                 Values(LINE_8),
746                                 Values(false)));
747
748
749 #ifdef HAVE_FREETYPE
750
751 INSTANTIATE_TEST_CASE_P(RenderBGROCVTestFTextsImpl, RenderBGROCVTestFTexts,
752                         Combine(Values(cv::Size(1280, 720)),
753                             Values(to_wstring("\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c"),
754                                    to_wstring("\xe3\x80\xa4\xe3\x80\xa5\xe3\x80\xa6\xe3\x80\xa7\xe3\x80\xa8\xe3\x80\x85\xe3\x80\x86")),
755                             Values(cv::Point(200, 200)),
756                             Values(64),
757                             Values(cv::Scalar(0, 255, 0))));
758
759 INSTANTIATE_TEST_CASE_P(RenderNV12OCVTestFTextsImpl, RenderNV12OCVTestFTexts,
760                         Combine(Values(cv::Size(1280, 720)),
761                             Values(to_wstring("\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c"),
762                                    to_wstring("\xe3\x80\xa4\xe3\x80\xa5\xe3\x80\xa6\xe3\x80\xa7\xe3\x80\xa8\xe3\x80\x85\xe3\x80\x86")),
763                             Values(cv::Point(200, 200)),
764                             Values(64),
765                             Values(cv::Scalar(0, 255, 0))));
766
767 INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestFTextsImpl, RenderMFrameOCVTestFTexts,
768                         Combine(Values(cv::Size(1280, 720)),
769                                 Values(to_wstring("\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c"),
770                                 to_wstring("\xe3\x80\xa4\xe3\x80\xa5\xe3\x80\xa6\xe3\x80\xa7\xe3\x80\xa8\xe3\x80\x85\xe3\x80\x86")),
771                                 Values(cv::Point(200, 200)),
772                                 Values(64),
773                                 Values(cv::Scalar(0, 255, 0))));
774
775 #endif // HAVE_FREETYPE
776
777 // FIXME Implement a macros to instantiate the tests because BGR and NV12 have the same parameters
778
779 INSTANTIATE_TEST_CASE_P(RenderBGROCVTestMosaicsImpl, RenderBGROCVTestMosaics,
780                         Combine(Values(cv::Size(1280, 720)),
781                                 Values(cv::Rect(100, 100, 200, 200),      // Normal case
782                                        cv::Rect(-50, -50, 200, 200),      // Intersection with left-top corner
783                                        cv::Rect(-50, 100, 200, 200),      // Intersection with left side
784                                        cv::Rect(-50, 600, 200, 200),      // Intersection with left-bottom corner
785                                        cv::Rect(100, 600, 200, 200),      // Intersection with bottom side
786                                        cv::Rect(1200, 700, 200, 200),     // Intersection with right-bottom corner
787                                        cv::Rect(1200, 400, 200, 200),     // Intersection with right side
788                                        cv::Rect(1200, -50, 200, 200),     // Intersection with right-top corner
789                                        cv::Rect(500, -50, 200, 200),      // Intersection with top side
790                                        cv::Rect(-100, 300, 1480, 300),    // From left to right side with intersection
791                                        cv::Rect(5000, 2000, 100, 100),    // Outside image
792                                        cv::Rect(-300, -300, 3000, 3000),  // Cover all image
793                                        cv::Rect(100, 100, -500, -500)),   // Negative width and height
794                                 Values(25),
795                                 Values(0)));
796
797 INSTANTIATE_TEST_CASE_P(RenderNV12OCVTestMosaicsImpl, RenderNV12OCVTestMosaics,
798                         Combine(Values(cv::Size(1280, 720)),
799                                 Values(cv::Rect(100, 100, 200, 200),      // Normal case
800                                        cv::Rect(-50, -50, 200, 200),      // Intersection with left-top corner
801                                        cv::Rect(-50, 100, 200, 200),      // Intersection with left side
802                                        cv::Rect(-50, 600, 200, 200),      // Intersection with left-bottom corner
803                                        cv::Rect(100, 600, 200, 200),      // Intersection with bottom side
804                                        cv::Rect(1200, 700, 200, 200),     // Intersection with right-bottom corner
805                                        cv::Rect(1200, 400, 200, 200),     // Intersection with right side
806                                        cv::Rect(1200, -50, 200, 200),     // Intersection with right-top corner
807                                        cv::Rect(500, -50, 200, 200),      // Intersection with top side
808                                        cv::Rect(-100, 300, 1480, 300),    // From left to right side with intersection
809                                        cv::Rect(5000, 2000, 100, 100),    // Outside image
810                                        cv::Rect(-300, -300, 3000, 3000),  // Cover all image
811                                        cv::Rect(100, 100, -500, -500)),   // Negative width and height
812                                 Values(25),
813                                 Values(0)));
814
815 INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestMosaicsImpl, RenderMFrameOCVTestMosaics,
816                         Combine(Values(cv::Size(1280, 720)),
817                                 Values(cv::Rect(100, 100, 200, 200),      // Normal case
818                                        cv::Rect(-50, -50, 200, 200),      // Intersection with left-top corner
819                                        cv::Rect(-50, 100, 200, 200),      // Intersection with left side
820                                        cv::Rect(-50, 600, 200, 200),      // Intersection with left-bottom corner
821                                        cv::Rect(100, 600, 200, 200),      // Intersection with bottom side
822                                        cv::Rect(1200, 700, 200, 200),     // Intersection with right-bottom corner
823                                        cv::Rect(1200, 400, 200, 200),     // Intersection with right side
824                                        cv::Rect(1200, -50, 200, 200),     // Intersection with right-top corner
825                                        cv::Rect(500, -50, 200, 200),      // Intersection with top side
826                                        cv::Rect(-100, 300, 1480, 300),    // From left to right side with intersection
827                                        cv::Rect(5000, 2000, 100, 100),    // Outside image
828                                        cv::Rect(-300, -300, 3000, 3000),  // Cover all image
829                                        cv::Rect(100, 100, -500, -500)),   // Negative width and height
830                                 Values(25),
831                                 Values(0)));
832
833 INSTANTIATE_TEST_CASE_P(RenderBGROCVTestImagesImpl, RenderBGROCVTestImages,
834                         Combine(Values(cv::Size(1280, 720)),
835                                 Values(cv::Rect(100, 100, 200, 200)),
836                                 Values(cv::Scalar(100, 150, 60)),
837                                 Values(1.0)));
838
839 INSTANTIATE_TEST_CASE_P(RenderNV12OCVTestImagesImpl, RenderNV12OCVTestImages,
840                         Combine(Values(cv::Size(1280, 720)),
841                                 Values(cv::Rect(100, 100, 200, 200)),
842                                 Values(cv::Scalar(100, 150, 60)),
843                                 Values(1.0)));
844
845 INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestImagesImpl, RenderMFrameOCVTestImages,
846                         Combine(Values(cv::Size(1280, 720)),
847                                 Values(cv::Rect(100, 100, 200, 200)),
848                                 Values(cv::Scalar(100, 150, 60)),
849                                 Values(1.0)));
850
851 INSTANTIATE_TEST_CASE_P(RenderBGROCVTestPolylinesImpl, RenderBGROCVTestPolylines,
852                         Combine(Values(cv::Size(1280, 720)),
853                                 Values(std::vector<cv::Point>{{100, 100}, {200, 200}, {150, 300}, {400, 150}}),
854                                 Values(cv::Scalar(100, 150, 60)),
855                                 Values(2),
856                                 Values(LINE_8),
857                                 Values(0)));
858
859 INSTANTIATE_TEST_CASE_P(RenderNV12OCVTestPolylinesImpl, RenderNV12OCVTestPolylines,
860                         Combine(Values(cv::Size(1280, 720)),
861                                 Values(std::vector<cv::Point>{{100, 100}, {200, 200}, {150, 300}, {400, 150}}),
862                                 Values(cv::Scalar(100, 150, 60)),
863                                 Values(2),
864                                 Values(LINE_8),
865                                 Values(0)));
866
867 INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestPolylinesImpl, RenderMFrameOCVTestPolylines,
868                         Combine(Values(cv::Size(1280, 720)),
869                                 Values(std::vector<cv::Point>{ {100, 100}, { 200, 200 }, { 150, 300 }, { 400, 150 }}),
870                                 Values(cv::Scalar(100, 150, 60)),
871                                 Values(2),
872                                 Values(LINE_8),
873                                 Values(0)));
874 }