}
}
+class TestMediaNV12 final : public cv::MediaFrame::IAdapter {
+ cv::Mat m_y;
+ cv::Mat m_uv;
+public:
+ TestMediaNV12(cv::Mat y, cv::Mat uv) : m_y(y), m_uv(uv) {
+ }
+ cv::GFrameDesc meta() const override {
+ return cv::GFrameDesc{ cv::MediaFormat::NV12, cv::Size(m_y.cols, m_y.rows) };
+ }
+ cv::MediaFrame::View access(cv::MediaFrame::Access) override {
+ cv::MediaFrame::View::Ptrs pp = {
+ m_y.ptr(), m_uv.ptr(), nullptr, nullptr
+ };
+ cv::MediaFrame::View::Strides ss = {
+ m_y.step, m_uv.step, 0u, 0u
+ };
+ return cv::MediaFrame::View(std::move(pp), std::move(ss));
+ }
+};
+
+TEST_P(RenderMFrameOCVTestTexts, AccuracyTest)
+{
+ // G-API code //////////////////////////////////////////////////////////////
+ cv::gapi::wip::draw::Prims prims;
+ prims.emplace_back(cv::gapi::wip::draw::Text{ text, org, ff, fs, color, thick, lt, blo });
+ cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
+ cv::gapi::wip::draw::render(nv12, prims);
+
+ // OpenCV code //////////////////////////////////////////////////////////////
+ {
+ // NV12 -> YUV
+ cv::Mat yuv;
+ cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
+
+ cv::putText(yuv, text, org, ff, fs, cvtBGRToYUVC(color), thick, lt, blo);
+
+ // YUV -> NV12
+ cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
+ }
+
+ // Comparison //////////////////////////////////////////////////////////////
+ {
+ EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
+ EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
+ }
+}
+
+
# ifdef HAVE_FREETYPE
TEST_P(RenderBGROCVTestFTexts, AccuracyTest)
})));
}
+TEST_P(RenderMFrameOCVTestFTexts, AccuracyTest)
+{
+ // G-API code //////////////////////////////////////////////////////////////
+ cv::Mat y_copy_mat = y_gapi_mat.clone();
+ cv::Mat uv_copy_mat = uv_gapi_mat.clone();
+ cv::gapi::wip::draw::Prims prims;
+ prims.emplace_back(cv::gapi::wip::draw::FText{ text, org, fh, color });
+ cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
+ EXPECT_NO_THROW(cv::gapi::wip::draw::render(nv12, prims,
+ cv::compile_args(cv::gapi::wip::draw::freetype_font{
+ "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
+ })));
+ EXPECT_NE(0, cv::norm(y_gapi_mat, y_copy_mat));
+ EXPECT_NE(0, cv::norm(uv_gapi_mat, uv_copy_mat));
+}
+
+
static std::wstring to_wstring(const char* bytes)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
}
}
+TEST_P(RenderMFrameOCVTestRects, AccuracyTest)
+{
+ // G-API code //////////////////////////////////////////////////////////////
+ cv::gapi::wip::draw::Prims prims;
+ prims.emplace_back(cv::gapi::wip::draw::Rect{ rect, color, thick, lt, shift });
+ cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
+ cv::gapi::wip::draw::render(nv12, prims);
+
+ // OpenCV code //////////////////////////////////////////////////////////////
+ {
+ // NV12 -> YUV
+ cv::Mat yuv;
+ cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
+
+ cv::rectangle(yuv, rect, cvtBGRToYUVC(color), thick, lt, shift);
+
+ // YUV -> NV12
+ cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
+ }
+
+ // Comparison //////////////////////////////////////////////////////////////
+ {
+ EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
+ EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
+ }
+}
+
TEST_P(RenderBGROCVTestCircles, AccuracyTest)
{
// G-API code //////////////////////////////////////////////////////////////
}
}
+TEST_P(RenderMFrameOCVTestCircles, AccuracyTest)
+{
+ // G-API code //////////////////////////////////////////////////////////////
+ cv::gapi::wip::draw::Prims prims;
+ prims.emplace_back(cv::gapi::wip::draw::Circle{ center, radius, color, thick, lt, shift });
+ cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
+ cv::gapi::wip::draw::render(nv12, prims);
+
+ // OpenCV code //////////////////////////////////////////////////////////////
+ {
+ // NV12 -> YUV
+ cv::Mat yuv;
+ cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
+
+ cv::circle(yuv, center, radius, cvtBGRToYUVC(color), thick, lt, shift);
+
+ // YUV -> NV12
+ cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
+ }
+
+ // Comparison //////////////////////////////////////////////////////////////
+ {
+ EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
+ EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
+ }
+}
+
TEST_P(RenderBGROCVTestLines, AccuracyTest)
{
// G-API code //////////////////////////////////////////////////////////////
}
}
+TEST_P(RenderMFrameOCVTestLines, AccuracyTest)
+{
+ // G-API code //////////////////////////////////////////////////////////////
+ cv::gapi::wip::draw::Prims prims;
+ prims.emplace_back(cv::gapi::wip::draw::Line{ pt1, pt2, color, thick, lt, shift });
+ cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
+ cv::gapi::wip::draw::render(nv12, prims);
+
+ // OpenCV code //////////////////////////////////////////////////////////////
+ {
+ // NV12 -> YUV
+ cv::Mat yuv;
+ cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
+
+ cv::line(yuv, pt1, pt2, cvtBGRToYUVC(color), thick, lt, shift);
+
+ // YUV -> NV12
+ cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
+ }
+
+ // Comparison //////////////////////////////////////////////////////////////
+ {
+ EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
+ EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
+ }
+}
+
TEST_P(RenderBGROCVTestMosaics, AccuracyTest)
{
// G-API code //////////////////////////////////////////////////////////////
}
}
+TEST_P(RenderMFrameOCVTestMosaics, AccuracyTest)
+{
+ // G-API code //////////////////////////////////////////////////////////////
+ cv::gapi::wip::draw::Prims prims;
+ prims.emplace_back(cv::gapi::wip::draw::Mosaic{ mos, cellsz, decim });
+ cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
+ cv::gapi::wip::draw::render(nv12, prims);
+
+ // OpenCV code //////////////////////////////////////////////////////////////
+ {
+ // NV12 -> YUV
+ cv::Mat yuv;
+ cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
+
+ drawMosaicRef(yuv, mos, cellsz);
+
+ // YUV -> NV12
+ cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
+ }
+
+ // Comparison //////////////////////////////////////////////////////////////
+ {
+ EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
+ EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
+ }
+}
+
TEST_P(RenderBGROCVTestImages, AccuracyTest)
{
cv::Mat img(rect.size(), CV_8UC3, color);
}
}
+TEST_P(RenderMFrameOCVTestImages, AccuracyTest)
+{
+ cv::Mat img(rect.size(), CV_8UC3, color);
+ cv::Mat alpha(rect.size(), CV_32FC1, transparency);
+ auto tl = rect.tl();
+ cv::Point org = { tl.x, tl.y + rect.size().height };
+
+ // G-API code //////////////////////////////////////////////////////////////
+ cv::gapi::wip::draw::Prims prims;
+ prims.emplace_back(cv::gapi::wip::draw::Image{ org, img, alpha });
+ cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
+ cv::gapi::wip::draw::render(nv12, prims);
+
+ // OpenCV code //////////////////////////////////////////////////////////////
+ {
+ // NV12 -> YUV
+ cv::Mat yuv;
+ cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
+
+ cv::Mat yuv_img;
+ cv::cvtColor(img, yuv_img, cv::COLOR_BGR2YUV);
+ blendImageRef(yuv, org, yuv_img, alpha);
+
+ // YUV -> NV12
+ cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
+ }
+
+ // Comparison //////////////////////////////////////////////////////////////
+ {
+ EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
+ EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
+ }
+}
+
TEST_P(RenderBGROCVTestPolylines, AccuracyTest)
{
// G-API code //////////////////////////////////////////////////////////////
}
}
+TEST_P(RenderMFrameOCVTestPolylines, AccuracyTest)
+{
+ // G-API code //////////////////////////////////////////////////////////////
+ cv::gapi::wip::draw::Prims prims;
+ prims.emplace_back(cv::gapi::wip::draw::Poly{ points, color, thick, lt, shift });
+ cv::MediaFrame nv12 = cv::MediaFrame::Create<TestMediaNV12>(y_gapi_mat, uv_gapi_mat);
+ cv::gapi::wip::draw::render(nv12, prims);
+
+ // OpenCV code //////////////////////////////////////////////////////////////
+ {
+ // NV12 -> YUV
+ cv::Mat yuv;
+ cv::gapi::wip::draw::cvtNV12ToYUV(y_ref_mat, uv_ref_mat, yuv);
+
+ std::vector<std::vector<cv::Point>> pp{ points };
+ cv::fillPoly(yuv, pp, cvtBGRToYUVC(color), lt, shift);
+
+ // YUV -> NV12
+ cv::gapi::wip::draw::cvtYUVToNV12(yuv, y_ref_mat, uv_ref_mat);
+ }
+
+ // Comparison //////////////////////////////////////////////////////////////
+ {
+ EXPECT_EQ(0, cv::norm(y_gapi_mat, y_ref_mat));
+ EXPECT_EQ(0, cv::norm(uv_gapi_mat, uv_ref_mat));
+ }
+}
+
// FIXME avoid code duplicate for NV12 and BGR cases
INSTANTIATE_TEST_CASE_P(RenderBGROCVTestRectsImpl, RenderBGROCVTestRects,
Combine(Values(cv::Size(1280, 720)),
Values(LINE_8),
Values(0)));
+INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestRectsImpl, RenderMFrameOCVTestRects,
+ Combine(Values(cv::Size(1280, 720)),
+ Values(cv::Rect(100, 100, 200, 200)),
+ Values(cv::Scalar(100, 50, 150)),
+ Values(2),
+ Values(LINE_8),
+ Values(0)));
+
INSTANTIATE_TEST_CASE_P(RenderBGROCVTestCirclesImpl, RenderBGROCVTestCircles,
Combine(Values(cv::Size(1280, 720)),
Values(cv::Point(100, 100)),
Values(LINE_8),
Values(0)));
+INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestCirclesImpl, RenderMFrameOCVTestCircles,
+ Combine(Values(cv::Size(1280, 720)),
+ Values(cv::Point(100, 100)),
+ Values(10),
+ Values(cv::Scalar(100, 50, 150)),
+ Values(2),
+ Values(LINE_8),
+ Values(0)));
+
INSTANTIATE_TEST_CASE_P(RenderBGROCVTestLinesImpl, RenderBGROCVTestLines,
Combine(Values(cv::Size(1280, 720)),
Values(cv::Point(100, 100)),
Values(LINE_8),
Values(0)));
+INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestLinesImpl, RenderMFrameOCVTestLines,
+ Combine(Values(cv::Size(1280, 720)),
+ Values(cv::Point(100, 100)),
+ Values(cv::Point(200, 200)),
+ Values(cv::Scalar(100, 50, 150)),
+ Values(2),
+ Values(LINE_8),
+ Values(0)));
+
INSTANTIATE_TEST_CASE_P(RenderBGROCVTestTextsImpl, RenderBGROCVTestTexts,
Combine(Values(cv::Size(1280, 720)),
Values("SomeText"),
Values(LINE_8),
Values(false)));
+INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestTextsImpl, RenderMFrameOCVTestTexts,
+ Combine(Values(cv::Size(1280, 720)),
+ Values("SomeText"),
+ Values(cv::Point(200, 200)),
+ Values(FONT_HERSHEY_SIMPLEX),
+ Values(2.0),
+ Values(cv::Scalar(0, 255, 0)),
+ Values(2),
+ Values(LINE_8),
+ Values(false)));
+
+
#ifdef HAVE_FREETYPE
INSTANTIATE_TEST_CASE_P(RenderBGROCVTestFTextsImpl, RenderBGROCVTestFTexts,
Values(cv::Point(200, 200)),
Values(64),
Values(cv::Scalar(0, 255, 0))));
+
+INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestFTextsImpl, RenderMFrameOCVTestFTexts,
+ Combine(Values(cv::Size(1280, 720)),
+ Values(to_wstring("\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c"),
+ to_wstring("\xe3\x80\xa4\xe3\x80\xa5\xe3\x80\xa6\xe3\x80\xa7\xe3\x80\xa8\xe3\x80\x85\xe3\x80\x86")),
+ Values(cv::Point(200, 200)),
+ Values(64),
+ Values(cv::Scalar(0, 255, 0))));
+
#endif // HAVE_FREETYPE
// FIXME Implement a macros to instantiate the tests because BGR and NV12 have the same parameters
Values(25),
Values(0)));
+INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestMosaicsImpl, RenderMFrameOCVTestMosaics,
+ Combine(Values(cv::Size(1280, 720)),
+ Values(cv::Rect(100, 100, 200, 200), // Normal case
+ cv::Rect(-50, -50, 200, 200), // Intersection with left-top corner
+ cv::Rect(-50, 100, 200, 200), // Intersection with left side
+ cv::Rect(-50, 600, 200, 200), // Intersection with left-bottom corner
+ cv::Rect(100, 600, 200, 200), // Intersection with bottom side
+ cv::Rect(1200, 700, 200, 200), // Intersection with right-bottom corner
+ cv::Rect(1200, 400, 200, 200), // Intersection with right side
+ cv::Rect(1200, -50, 200, 200), // Intersection with right-top corner
+ cv::Rect(500, -50, 200, 200), // Intersection with top side
+ cv::Rect(-100, 300, 1480, 300), // From left to right side with intersection
+ cv::Rect(5000, 2000, 100, 100), // Outside image
+ cv::Rect(-300, -300, 3000, 3000), // Cover all image
+ cv::Rect(100, 100, -500, -500)), // Negative width and height
+ Values(25),
+ Values(0)));
+
INSTANTIATE_TEST_CASE_P(RenderBGROCVTestImagesImpl, RenderBGROCVTestImages,
Combine(Values(cv::Size(1280, 720)),
Values(cv::Rect(100, 100, 200, 200)),
Values(cv::Scalar(100, 150, 60)),
Values(1.0)));
+INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestImagesImpl, RenderMFrameOCVTestImages,
+ Combine(Values(cv::Size(1280, 720)),
+ Values(cv::Rect(100, 100, 200, 200)),
+ Values(cv::Scalar(100, 150, 60)),
+ Values(1.0)));
+
INSTANTIATE_TEST_CASE_P(RenderBGROCVTestPolylinesImpl, RenderBGROCVTestPolylines,
Combine(Values(cv::Size(1280, 720)),
Values(std::vector<cv::Point>{{100, 100}, {200, 200}, {150, 300}, {400, 150}}),
Values(2),
Values(LINE_8),
Values(0)));
+
+INSTANTIATE_TEST_CASE_P(RenderMFrameOCVTestPolylinesImpl, RenderMFrameOCVTestPolylines,
+ Combine(Values(cv::Size(1280, 720)),
+ Values(std::vector<cv::Point>{ {100, 100}, { 200, 200 }, { 150, 300 }, { 400, 150 }}),
+ Values(cv::Scalar(100, 150, 60)),
+ Values(2),
+ Values(LINE_8),
+ Values(0)));
}