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.
5 // Copyright (C) 2018 Intel Corporation
10 #endif // HAVE_FREETYPE
12 #include "../test_precomp.hpp"
13 #include "../common/gapi_render_tests.hpp"
15 #include "api/render_priv.hpp"
21 GAPI_RENDER_TEST_FIXTURES(OCVTestFTexts, FIXTURE_API(std::wstring, cv::Point, int, cv::Scalar), 4, text, org, fh, color)
22 #endif // HAVE_FREETYPE
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)
32 TEST_P(RenderBGROCVTestTexts, AccuracyTest)
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);
39 // OpenCV code //////////////////////////////////////////////////////////////
41 cv::putText(ref_mat, text, org, ff, fs, color, thick, lt, blo);
44 // Comparison //////////////////////////////////////////////////////////////
46 EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
50 TEST_P(RenderNV12OCVTestTexts, AccuracyTest)
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);
57 // OpenCV code //////////////////////////////////////////////////////////////
61 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
63 cv::putText(yuv, text, org, ff, fs, cvtBGRToYUVC(color), thick, lt, blo);
66 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
69 // Comparison //////////////////////////////////////////////////////////////
71 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
72 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
76 class TestMediaNV12 final : public cv::MediaFrame::IAdapter {
80 TestMediaNV12(cv::Mat y, cv::Mat uv) : m_y(y), m_uv(uv) {
82 cv::GFrameDesc meta() const override {
83 return cv::GFrameDesc{ cv::MediaFormat::NV12, cv::Size(m_y.cols, m_y.rows) };
85 cv::MediaFrame::View access(cv::MediaFrame::Access) override {
86 cv::MediaFrame::View::Ptrs pp = {
87 m_y.ptr(), m_uv.ptr(), nullptr, nullptr
89 cv::MediaFrame::View::Strides ss = {
90 m_y.step, m_uv.step, 0u, 0u
92 return cv::MediaFrame::View(std::move(pp), std::move(ss));
96 TEST_P(RenderMFrameOCVTestTexts, AccuracyTest)
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);
104 // OpenCV code //////////////////////////////////////////////////////////////
108 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
110 cv::putText(yuv, text, org, ff, fs, cvtBGRToYUVC(color), thick, lt, blo);
113 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
116 // Comparison //////////////////////////////////////////////////////////////
118 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
119 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
124 # ifdef HAVE_FREETYPE
126 TEST_P(RenderBGROCVTestFTexts, AccuracyTest)
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"
137 TEST_P(RenderNV12OCVTestFTexts, AccuracyTest)
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"
148 TEST_P(RenderMFrameOCVTestFTexts, AccuracyTest)
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"
160 EXPECT_NE(0, cv::norm(y_gapi_mat, y_copy_mat));
161 EXPECT_NE(0, cv::norm(uv_gapi_mat, uv_copy_mat));
165 static std::wstring to_wstring(const char* bytes)
167 std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
168 return converter.from_bytes(bytes);
171 TEST(RenderFText, FontsNotPassedToCompileArgs)
173 cv::Mat in_mat(640, 480, CV_8UC3, cv::Scalar::all(0));
175 std::wstring text = to_wstring("\xe4\xbd\xa0\xe5\xa5\xbd");
176 cv::Point org(100, 100);
178 cv::Scalar color(200, 100, 25);
180 cv::gapi::wip::draw::Prims prims;
181 prims.emplace_back(cv::gapi::wip::draw::FText{text, org, fh, color});
183 EXPECT_ANY_THROW(cv::gapi::wip::draw::render(in_mat, prims));
186 #endif // HAVE_FREETYPE
188 TEST_P(RenderBGROCVTestRects, AccuracyTest)
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);
195 // OpenCV code //////////////////////////////////////////////////////////////
197 cv::rectangle(ref_mat, rect, color, thick, lt, shift);
200 // Comparison //////////////////////////////////////////////////////////////
202 EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
206 TEST_P(RenderNV12OCVTestRects, AccuracyTest)
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);
213 // OpenCV code //////////////////////////////////////////////////////////////
217 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
219 cv::rectangle(yuv, rect, cvtBGRToYUVC(color), thick, lt, shift);
222 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
225 // Comparison //////////////////////////////////////////////////////////////
227 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
228 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
232 TEST_P(RenderMFrameOCVTestRects, AccuracyTest)
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);
240 // OpenCV code //////////////////////////////////////////////////////////////
244 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
246 cv::rectangle(yuv, rect, cvtBGRToYUVC(color), thick, lt, shift);
249 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
252 // Comparison //////////////////////////////////////////////////////////////
254 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
255 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
259 TEST_P(RenderBGROCVTestCircles, AccuracyTest)
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);
266 // OpenCV code //////////////////////////////////////////////////////////////
268 cv::circle(ref_mat, center, radius, color, thick, lt, shift);
271 // Comparison //////////////////////////////////////////////////////////////
273 EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
277 TEST_P(RenderNV12OCVTestCircles, AccuracyTest)
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);
284 // OpenCV code //////////////////////////////////////////////////////////////
288 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
290 cv::circle(yuv, center, radius, cvtBGRToYUVC(color), thick, lt, shift);
293 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
296 // Comparison //////////////////////////////////////////////////////////////
298 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
299 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
303 TEST_P(RenderMFrameOCVTestCircles, AccuracyTest)
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);
311 // OpenCV code //////////////////////////////////////////////////////////////
315 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
317 cv::circle(yuv, center, radius, cvtBGRToYUVC(color), thick, lt, shift);
320 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
323 // Comparison //////////////////////////////////////////////////////////////
325 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
326 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
330 TEST_P(RenderBGROCVTestLines, AccuracyTest)
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);
337 // OpenCV code //////////////////////////////////////////////////////////////
339 cv::line(ref_mat, pt1, pt2, color, thick, lt, shift);
342 // Comparison //////////////////////////////////////////////////////////////
344 EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
348 TEST_P(RenderNV12OCVTestLines, AccuracyTest)
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);
355 // OpenCV code //////////////////////////////////////////////////////////////
359 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
361 cv::line(yuv, pt1, pt2, cvtBGRToYUVC(color), thick, lt, shift);
364 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
367 // Comparison //////////////////////////////////////////////////////////////
369 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
370 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
374 TEST_P(RenderMFrameOCVTestLines, AccuracyTest)
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);
382 // OpenCV code //////////////////////////////////////////////////////////////
386 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
388 cv::line(yuv, pt1, pt2, cvtBGRToYUVC(color), thick, lt, shift);
391 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
394 // Comparison //////////////////////////////////////////////////////////////
396 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
397 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
401 TEST_P(RenderBGROCVTestMosaics, AccuracyTest)
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);
408 // OpenCV code //////////////////////////////////////////////////////////////
410 drawMosaicRef(ref_mat, mos, cellsz);
413 // Comparison //////////////////////////////////////////////////////////////
415 EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
419 TEST_P(RenderNV12OCVTestMosaics, AccuracyTest)
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);
426 // OpenCV code //////////////////////////////////////////////////////////////
430 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
432 drawMosaicRef(yuv, mos, cellsz);
435 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
438 // Comparison //////////////////////////////////////////////////////////////
440 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
441 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
445 TEST_P(RenderMFrameOCVTestMosaics, AccuracyTest)
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);
453 // OpenCV code //////////////////////////////////////////////////////////////
457 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
459 drawMosaicRef(yuv, mos, cellsz);
462 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
465 // Comparison //////////////////////////////////////////////////////////////
467 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
468 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
472 TEST_P(RenderBGROCVTestImages, AccuracyTest)
474 cv::Mat img(rect.size(), CV_8UC3, color);
475 cv::Mat alpha(rect.size(), CV_32FC1, transparency);
477 cv::Point org = {tl.x, tl.y + rect.size().height};
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);
484 // OpenCV code //////////////////////////////////////////////////////////////
486 blendImageRef(ref_mat, org, img, alpha);
489 // Comparison //////////////////////////////////////////////////////////////
491 EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
495 TEST_P(RenderNV12OCVTestImages, AccuracyTest)
497 cv::Mat img(rect.size(), CV_8UC3, color);
498 cv::Mat alpha(rect.size(), CV_32FC1, transparency);
500 cv::Point org = {tl.x, tl.y + rect.size().height};
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);
507 // OpenCV code //////////////////////////////////////////////////////////////
511 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
514 cv::cvtColor(img, yuv_img, cv::COLOR_BGR2YUV);
515 blendImageRef(yuv, org, yuv_img, alpha);
518 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
521 // Comparison //////////////////////////////////////////////////////////////
523 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
524 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
528 TEST_P(RenderMFrameOCVTestImages, AccuracyTest)
530 cv::Mat img(rect.size(), CV_8UC3, color);
531 cv::Mat alpha(rect.size(), CV_32FC1, transparency);
533 cv::Point org = { tl.x, tl.y + rect.size().height };
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);
541 // OpenCV code //////////////////////////////////////////////////////////////
545 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
548 cv::cvtColor(img, yuv_img, cv::COLOR_BGR2YUV);
549 blendImageRef(yuv, org, yuv_img, alpha);
552 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
555 // Comparison //////////////////////////////////////////////////////////////
557 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
558 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
562 TEST_P(RenderBGROCVTestPolylines, AccuracyTest)
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);
569 // OpenCV code //////////////////////////////////////////////////////////////
571 std::vector<std::vector<cv::Point>> array_points{points};
572 cv::fillPoly(ref_mat, array_points, color, lt, shift);
575 // Comparison //////////////////////////////////////////////////////////////
577 EXPECT_EQ(0, cv::norm(gapi_mat, ref_mat));
581 TEST_P(RenderNV12OCVTestPolylines, AccuracyTest)
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);
588 // OpenCV code //////////////////////////////////////////////////////////////
592 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
594 std::vector<std::vector<cv::Point>> pp{points};
595 cv::fillPoly(yuv, pp, cvtBGRToYUVC(color), lt, shift);
598 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
601 // Comparison //////////////////////////////////////////////////////////////
603 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
604 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
608 TEST_P(RenderMFrameOCVTestPolylines, AccuracyTest)
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);
616 // OpenCV code //////////////////////////////////////////////////////////////
620 cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
622 std::vector<std::vector<cv::Point>> pp{ points };
623 cv::fillPoly(yuv, pp, cvtBGRToYUVC(color), lt, shift);
626 cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
629 // Comparison //////////////////////////////////////////////////////////////
631 EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
632 EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
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)),
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)),
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)),
661 INSTANTIATE_TEST_CASE_P(RenderBGROCVTestCirclesImpl, RenderBGROCVTestCircles,
662 Combine(Values(cv::Size(1280, 720)),
663 Values(cv::Point(100, 100)),
665 Values(cv::Scalar(100, 50, 150)),
670 INSTANTIATE_TEST_CASE_P(RenderNV12OCVTestCirclesImpl, RenderNV12OCVTestCircles,
671 Combine(Values(cv::Size(1280, 720)),
672 Values(cv::Point(100, 100)),
674 Values(cv::Scalar(100, 50, 150)),
679 INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestCirclesImpl, RenderMFrameOCVTestCircles,
680 Combine(Values(cv::Size(1280, 720)),
681 Values(cv::Point(100, 100)),
683 Values(cv::Scalar(100, 50, 150)),
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)),
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)),
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)),
715 INSTANTIATE_TEST_CASE_P(RenderBGROCVTestTextsImpl, RenderBGROCVTestTexts,
716 Combine(Values(cv::Size(1280, 720)),
718 Values(cv::Point(200, 200)),
719 Values(FONT_HERSHEY_SIMPLEX),
721 Values(cv::Scalar(0, 255, 0)),
726 INSTANTIATE_TEST_CASE_P(RenderNV12OCVTestTextsImpl, RenderNV12OCVTestTexts,
727 Combine(Values(cv::Size(1280, 720)),
729 Values(cv::Point(200, 200)),
730 Values(FONT_HERSHEY_SIMPLEX),
732 Values(cv::Scalar(0, 255, 0)),
737 INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestTextsImpl, RenderMFrameOCVTestTexts,
738 Combine(Values(cv::Size(1280, 720)),
740 Values(cv::Point(200, 200)),
741 Values(FONT_HERSHEY_SIMPLEX),
743 Values(cv::Scalar(0, 255, 0)),
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)),
757 Values(cv::Scalar(0, 255, 0))));
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)),
765 Values(cv::Scalar(0, 255, 0))));
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)),
773 Values(cv::Scalar(0, 255, 0))));
775 #endif // HAVE_FREETYPE
777 // FIXME Implement a macros to instantiate the tests because BGR and NV12 have the same parameters
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
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
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
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)),
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)),
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)),
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)),
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)),
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)),