mirror of https://github.com/opencv/opencv.git
Merge pull request #14892 from TolyaTalamanov:at/parameterized-render-tests
G-API: Parameterized render tests (#14892) * Init commit * Add mat size as test parameter * Add test for text render * Add test for rect render * Add tests for line and circle * Remove old render tests * Init output mats * Remove methods input arguments * Add comment about data loss in BGR2NV12 conversion * Add edge test cases * Replace default color for out mats black -> whitepull/14932/head
parent
75c567b6ab
commit
8dd596b7ba
6 changed files with 245 additions and 228 deletions
@ -0,0 +1,9 @@ |
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
//
|
||||
// Copyright (C) 2018 Intel Corporation
|
||||
|
||||
|
||||
#include "../test_precomp.hpp" |
||||
#include "gapi_render_tests_inl.hpp" |
@ -0,0 +1,73 @@ |
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
//
|
||||
// Copyright (C) 2018 Intel Corporation
|
||||
|
||||
|
||||
#ifndef OPENCV_GAPI_RENDER_TESTS_HPP |
||||
#define OPENCV_GAPI_RENDER_TESTS_HPP |
||||
|
||||
#include "gapi_tests_common.hpp" |
||||
#include "api/render_priv.hpp" |
||||
|
||||
namespace opencv_test |
||||
{ |
||||
|
||||
using Points = std::vector<cv::Point>; |
||||
using Rects = std::vector<cv::Rect>; |
||||
using PairOfPoints = std::pair<cv::Point, cv::Point>; |
||||
using VecOfPairOfPoints = std::vector<PairOfPoints>; |
||||
|
||||
template<class T> |
||||
class RenderWithParam : public TestWithParam<T> |
||||
{ |
||||
protected: |
||||
void Init() |
||||
{ |
||||
MatType type = CV_8UC3; |
||||
out_mat_ocv = cv::Mat(sz, type, cv::Scalar(255)); |
||||
out_mat_gapi = cv::Mat(sz, type, cv::Scalar(255)); |
||||
|
||||
if (isNV12Format) { |
||||
/* NB: When converting data from BGR to NV12, data loss occurs,
|
||||
* so the reference data is subjected to the same transformation |
||||
* for correct comparison of the test results */ |
||||
cv::gapi::wip::draw::BGR2NV12(out_mat_ocv, y, uv); |
||||
cv::cvtColorTwoPlane(y, uv, out_mat_ocv, cv::COLOR_YUV2BGR_NV12); |
||||
} |
||||
} |
||||
|
||||
void Run() |
||||
{ |
||||
if (isNV12Format) { |
||||
cv::gapi::wip::draw::BGR2NV12(out_mat_gapi, y, uv); |
||||
cv::gapi::wip::draw::render(y, uv, prims); |
||||
cv::cvtColorTwoPlane(y, uv, out_mat_gapi, cv::COLOR_YUV2BGR_NV12); |
||||
|
||||
// NB: Also due to data loss
|
||||
cv::gapi::wip::draw::BGR2NV12(out_mat_ocv, y, uv); |
||||
cv::cvtColorTwoPlane(y, uv, out_mat_ocv, cv::COLOR_YUV2BGR_NV12); |
||||
} else { |
||||
cv::gapi::wip::draw::render(out_mat_gapi, prims); |
||||
} |
||||
} |
||||
|
||||
cv::Size sz; |
||||
cv::Scalar color; |
||||
int thick; |
||||
int lt; |
||||
bool isNV12Format; |
||||
std::vector<cv::gapi::wip::draw::Prim> prims; |
||||
cv::Mat y, uv; |
||||
cv::Mat out_mat_ocv, out_mat_gapi; |
||||
}; |
||||
|
||||
struct RenderTextTest : public RenderWithParam <std::tuple<cv::Size,std::string,Points,int,double,cv::Scalar,int,int,bool,bool>> {}; |
||||
struct RenderRectTest : public RenderWithParam <std::tuple<cv::Size,Rects,cv::Scalar,int,int,int,bool>> {}; |
||||
struct RenderCircleTest : public RenderWithParam <std::tuple<cv::Size,Points,int,cv::Scalar,int,int,int,bool>> {}; |
||||
struct RenderLineTest : public RenderWithParam <std::tuple<cv::Size,VecOfPairOfPoints,cv::Scalar,int,int,int,bool>> {}; |
||||
|
||||
} // opencv_test
|
||||
|
||||
#endif //OPENCV_GAPI_RENDER_TESTS_HPP
|
@ -0,0 +1,96 @@ |
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
//
|
||||
// Copyright (C) 2018 Intel Corporation
|
||||
|
||||
|
||||
#ifndef OPENCV_GAPI_RENDER_TESTS_INL_HPP |
||||
#define OPENCV_GAPI_RENDER_TESTS_INL_HPP |
||||
|
||||
#include "gapi_render_tests.hpp" |
||||
|
||||
#include <opencv2/gapi/render.hpp> |
||||
|
||||
namespace opencv_test |
||||
{ |
||||
|
||||
TEST_P(RenderTextTest, AccuracyTest) |
||||
{ |
||||
std::vector<cv::Point> points; |
||||
std::string text; |
||||
int ff; |
||||
double fs; |
||||
bool blo; |
||||
|
||||
std::tie(sz, text, points, ff, fs, color, thick, lt, blo, isNV12Format) = GetParam(); |
||||
Init(); |
||||
|
||||
for (const auto& p : points) { |
||||
cv::putText(out_mat_ocv, text, p, ff, fs, color, thick, lt, blo); |
||||
prims.emplace_back(cv::gapi::wip::draw::Text{text, p, ff, fs, color, thick, lt, blo}); |
||||
} |
||||
|
||||
Run(); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); |
||||
} |
||||
|
||||
TEST_P(RenderRectTest, AccuracyTest) |
||||
{ |
||||
std::vector<cv::Rect> rects; |
||||
int shift; |
||||
|
||||
std::tie(sz, rects, color, thick, lt, shift, isNV12Format) = GetParam(); |
||||
Init(); |
||||
|
||||
for (const auto& r : rects) { |
||||
cv::rectangle(out_mat_ocv, r, color, thick, lt, shift); |
||||
prims.emplace_back(cv::gapi::wip::draw::Rect{r, color, thick, lt, shift}); |
||||
} |
||||
|
||||
Run(); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); |
||||
} |
||||
|
||||
TEST_P(RenderCircleTest, AccuracyTest) |
||||
{ |
||||
std::vector<cv::Point> points; |
||||
int radius; |
||||
int shift; |
||||
|
||||
std::tie(sz, points, radius, color, thick, lt, shift, isNV12Format) = GetParam(); |
||||
Init(); |
||||
|
||||
for (const auto& p : points) { |
||||
cv::circle(out_mat_ocv, p, radius, color, thick, lt, shift); |
||||
prims.emplace_back(cv::gapi::wip::draw::Circle{p, radius, color, thick, lt, shift}); |
||||
} |
||||
|
||||
Run(); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); |
||||
} |
||||
|
||||
TEST_P(RenderLineTest, AccuracyTest) |
||||
{ |
||||
std::vector<std::pair<cv::Point, cv::Point>> points; |
||||
int shift; |
||||
|
||||
std::tie(sz, points, color, thick, lt, shift, isNV12Format) = GetParam(); |
||||
Init(); |
||||
|
||||
for (const auto& p : points) { |
||||
cv::line(out_mat_ocv, p.first, p.second, color, thick, lt, shift); |
||||
prims.emplace_back(cv::gapi::wip::draw::Line{p.first, p.second, color, thick, lt, shift}); |
||||
} |
||||
|
||||
Run(); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv)); |
||||
} |
||||
|
||||
} // opencv_test
|
||||
|
||||
#endif //OPENCV_GAPI_RENDER_TESTS_INL_HPP
|
@ -0,0 +1,66 @@ |
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
//
|
||||
// Copyright (C) 2018 Intel Corporation
|
||||
|
||||
|
||||
#include "../test_precomp.hpp" |
||||
#include "../common/gapi_render_tests.hpp" |
||||
|
||||
namespace opencv_test |
||||
{ |
||||
|
||||
INSTANTIATE_TEST_CASE_P(RenderTextTestCPU, RenderTextTest, |
||||
Combine(Values(cv::Size(1280, 720), |
||||
cv::Size(640, 480), |
||||
cv::Size(128, 128)), |
||||
Values("text"), |
||||
Values(Points{Point(5, 30), Point(40, 70), Point(-1, -1)}), |
||||
/* Font face */ Values(FONT_HERSHEY_SIMPLEX), |
||||
/* Font scale */ Values(2), |
||||
/* Color */ Values(cv::Scalar(255, 0, 0)), |
||||
/* Thickness */ Values(1), |
||||
/* Line type */ Values(LINE_8), |
||||
/* Bottom left origin */ testing::Bool(), |
||||
/* NV12 format or not */ testing::Bool())); |
||||
|
||||
INSTANTIATE_TEST_CASE_P(RenderRectTestCPU, RenderRectTest, |
||||
Combine(Values(cv::Size(1280, 720), |
||||
cv::Size(640, 480), |
||||
cv::Size(128, 128)), |
||||
Values(Rects{Rect(5, 30, 40, 50), |
||||
Rect(40, 70, 40, 50), |
||||
/* Edge case, rectangle will not be drawn */ Rect(75, 110, -40, 50), |
||||
/* Edge case, rectangle will not be drawn */ Rect(70, 100, 0, 50)}), |
||||
/* Color */ Values(cv::Scalar(255, 0, 0)), |
||||
/* Thickness */ Values(1), |
||||
/* Line type */ Values(LINE_8), |
||||
/* Shift */ Values(0), |
||||
/* NV12 format or not */ testing::Bool())); |
||||
|
||||
INSTANTIATE_TEST_CASE_P(RenderCircleTestCPU, RenderCircleTest, |
||||
Combine(Values(cv::Size(1280, 720), |
||||
cv::Size(640, 480), |
||||
cv::Size(128, 128)), |
||||
Values(Points{Point(5, 30), Point(40, 70), Point(75, 110)}), |
||||
/* Radius */ Values(5), |
||||
/* Color */ Values(cv::Scalar(255, 0, 0)), |
||||
/* Thickness */ Values(1), |
||||
/* Line type */ Values(LINE_8), |
||||
/* Shift */ Values(0), |
||||
/* NV12 format or not */ testing::Bool())); |
||||
|
||||
INSTANTIATE_TEST_CASE_P(RenderLineTestCPU, RenderLineTest, |
||||
Combine(Values(cv::Size(1280, 720), |
||||
cv::Size(640, 480), |
||||
cv::Size(128, 128)), |
||||
Values(VecOfPairOfPoints{ {Point(5, 30) , Point(5, 40) }, |
||||
{Point(40, 70) , Point(50, 70) }, |
||||
{Point(75, 110), Point(100, 115)} }), |
||||
/* Color */ Values(cv::Scalar(255, 0, 0)), |
||||
/* Thickness */ Values(1), |
||||
/* Line type */ Values(LINE_8), |
||||
/* Shift */ Values(0), |
||||
/* NV12 format or not */ testing::Bool())); |
||||
} |
@ -1,227 +0,0 @@ |
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
//
|
||||
// Copyright (C) 2018 Intel Corporation
|
||||
|
||||
#include "test_precomp.hpp" |
||||
|
||||
#include "api/render_priv.hpp" |
||||
|
||||
#include <opencv2/imgproc.hpp> |
||||
#include <opencv2/gapi/render.hpp> |
||||
#include <opencv2/gapi/own/scalar.hpp> |
||||
|
||||
namespace opencv_test |
||||
{ |
||||
|
||||
namespace |
||||
{ |
||||
struct RenderTestFixture : public ::testing::Test |
||||
{ |
||||
cv::Size size = {30, 40}; |
||||
int thick = 2; |
||||
int ff = cv::FONT_HERSHEY_SIMPLEX; |
||||
int lt = LINE_8; |
||||
double fs = 1; |
||||
int radius = 15; |
||||
int shift = 0; |
||||
|
||||
cv::Mat ref_mat {320, 480, CV_8UC3, cv::Scalar::all(255)}; |
||||
cv::Mat out_mat {320, 480, CV_8UC3, cv::Scalar::all(255)}; |
||||
cv::Scalar color {0, 255, 0}; |
||||
std::string text {"some text"}; |
||||
|
||||
}; |
||||
} // namespace
|
||||
|
||||
TEST(BGR2NV12Test, CorrectConversion) |
||||
{ |
||||
cv::Mat in_mat(320, 240, CV_8UC3); |
||||
cv::Mat out_y, out_uv, ref_y, yuv; |
||||
cv::randu(in_mat, cv::Scalar::all(0), cv::Scalar::all(255)); |
||||
|
||||
cv::cvtColor(in_mat, yuv, cv::COLOR_BGR2YUV); |
||||
cv::Mat channels[3]; |
||||
cv::split(yuv, channels); |
||||
|
||||
ref_y = channels[0]; |
||||
cv::Mat ref_uv(in_mat.size() / 2, CV_8UC2); |
||||
cv::resize(channels[1], channels[1], channels[1].size() / 2, 0, 0, cv::INTER_NEAREST); |
||||
cv::resize(channels[2], channels[2], channels[2].size() / 2, 0, 0, cv::INTER_NEAREST); |
||||
cv::merge(channels + 1, 2, ref_uv); |
||||
|
||||
cv::gapi::wip::draw::BGR2NV12(in_mat, out_y, out_uv); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_y != ref_y)); |
||||
EXPECT_EQ(0, cv::countNonZero(out_uv != ref_uv)); |
||||
} |
||||
|
||||
TEST_F(RenderTestFixture, PutText) |
||||
{ |
||||
std::vector<cv::gapi::wip::draw::Prim> prims; |
||||
|
||||
for (int i = 0; i < 5; ++i) |
||||
{ |
||||
cv::Point point {30 + i * 60, 40 + i * 50}; |
||||
|
||||
cv::putText(ref_mat, text, point, ff, fs, color, thick); |
||||
prims.emplace_back(cv::gapi::wip::draw::Text{text, point, ff, fs, color, thick, lt, false}); |
||||
} |
||||
|
||||
cv::gapi::wip::draw::render(out_mat, prims); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat)); |
||||
} |
||||
|
||||
TEST_F(RenderTestFixture, Rectangle) |
||||
{ |
||||
std::vector<cv::gapi::wip::draw::Prim> prims; |
||||
|
||||
for (int i = 0; i < 5; ++i) |
||||
{ |
||||
cv::Rect rect {30 + i * 60, 40 + i * 50, size.width, size.height}; |
||||
cv::rectangle(ref_mat, rect, color, thick, lt, shift); |
||||
prims.emplace_back(cv::gapi::wip::draw::Rect{rect, color, thick, lt, shift}); |
||||
} |
||||
|
||||
cv::gapi::wip::draw::render(out_mat, prims); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat)); |
||||
} |
||||
|
||||
TEST_F(RenderTestFixture, Circle) |
||||
{ |
||||
std::vector<cv::gapi::wip::draw::Prim> prims; |
||||
|
||||
for (int i = 0; i < 5; ++i) |
||||
{ |
||||
cv::Point center {30 + i * 60, 40 + i * 50}; |
||||
cv::circle(ref_mat, center, radius, color, thick, lt, shift); |
||||
prims.emplace_back(cv::gapi::wip::draw::Circle{center, radius, color, thick, lt, shift}); |
||||
} |
||||
|
||||
cv::gapi::wip::draw::render(out_mat, prims); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat)); |
||||
} |
||||
|
||||
TEST_F(RenderTestFixture, Line) |
||||
{ |
||||
std::vector<cv::gapi::wip::draw::Prim> prims; |
||||
|
||||
for (int i = 0; i < 5; ++i) |
||||
{ |
||||
cv::Point pt1{30 + i * 60 , 40 + i * 50}; |
||||
cv::Point pt2{30 + i * 60 + 40, 40 + i * 50}; |
||||
|
||||
cv::line(ref_mat, pt1, pt2, color, thick, lt, shift); |
||||
prims.emplace_back(cv::gapi::wip::draw::Line{pt1, pt2, color, thick, lt, shift}); |
||||
} |
||||
|
||||
cv::gapi::wip::draw::render(out_mat, prims); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat)); |
||||
} |
||||
|
||||
TEST_F(RenderTestFixture, PutTextAndRectangle) |
||||
{ |
||||
std::vector<cv::gapi::wip::draw::Prim> prims; |
||||
|
||||
for (int i = 0; i < 5; ++i) |
||||
{ |
||||
cv::Point point {30 + i * 60, 40 + i * 50}; |
||||
cv::Rect rect {point, size}; |
||||
|
||||
cv::rectangle(ref_mat, rect, color, thick); |
||||
cv::putText(ref_mat, text, point, ff, fs, color, thick); |
||||
|
||||
prims.emplace_back(cv::gapi::wip::draw::Rect{rect, color, thick, lt, shift}); |
||||
prims.emplace_back(cv::gapi::wip::draw::Text{text, point, ff, fs, color, thick, lt, false}); |
||||
} |
||||
|
||||
cv::gapi::wip::draw::render(out_mat, prims); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat)); |
||||
} |
||||
|
||||
TEST_F(RenderTestFixture, PutTextAndRectangleNV12) |
||||
{ |
||||
cv::Mat y; |
||||
cv::Mat uv; |
||||
cv::gapi::wip::draw::BGR2NV12(out_mat, y, uv); |
||||
|
||||
std::vector<cv::gapi::wip::draw::Prim> prims; |
||||
|
||||
for (int i = 0; i < 5; ++i) |
||||
{ |
||||
cv::Point point {30 + i * 60, 40 + i * 50}; |
||||
cv::Rect rect {point, size}; |
||||
|
||||
cv::rectangle(ref_mat, rect, color, thick); |
||||
cv::putText(ref_mat, text, point, ff, fs, color, thick); |
||||
|
||||
prims.emplace_back(cv::gapi::wip::draw::Rect{rect, color, thick, lt, shift}); |
||||
prims.emplace_back(cv::gapi::wip::draw::Text{text, point, ff, fs, color, thick, lt, false}); |
||||
} |
||||
|
||||
cv::gapi::wip::draw::render(y, uv, prims); |
||||
cv::cvtColorTwoPlane(y, uv, out_mat, cv::COLOR_YUV2BGR_NV12); |
||||
|
||||
cv::gapi::wip::draw::BGR2NV12(ref_mat, y, uv); |
||||
cv::cvtColorTwoPlane(y, uv, ref_mat, cv::COLOR_YUV2BGR_NV12); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat)); |
||||
} |
||||
|
||||
TEST_F(RenderTestFixture, CircleNV12) |
||||
{ |
||||
cv::Mat y; |
||||
cv::Mat uv; |
||||
cv::gapi::wip::draw::BGR2NV12(out_mat, y, uv); |
||||
|
||||
std::vector<cv::gapi::wip::draw::Prim> prims; |
||||
|
||||
for (int i = 0; i < 5; ++i) |
||||
{ |
||||
cv::Point center {30 + i * 60, 40 + i * 50}; |
||||
cv::circle(ref_mat, center, radius, color, thick, lt, shift); |
||||
prims.emplace_back(cv::gapi::wip::draw::Circle{center, radius, color, thick, lt, shift}); |
||||
} |
||||
|
||||
cv::gapi::wip::draw::render(y, uv, prims); |
||||
cv::cvtColorTwoPlane(y, uv, out_mat, cv::COLOR_YUV2BGR_NV12); |
||||
|
||||
cv::gapi::wip::draw::BGR2NV12(ref_mat, y, uv); |
||||
cv::cvtColorTwoPlane(y, uv, ref_mat, cv::COLOR_YUV2BGR_NV12); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat)); |
||||
} |
||||
|
||||
TEST_F(RenderTestFixture, LineNV12) |
||||
{ |
||||
cv::Mat y; |
||||
cv::Mat uv; |
||||
cv::gapi::wip::draw::BGR2NV12(out_mat, y, uv); |
||||
|
||||
std::vector<cv::gapi::wip::draw::Prim> prims; |
||||
|
||||
for (int i = 0; i < 5; ++i) |
||||
{ |
||||
cv::Point pt1{30 + i * 60 , 40 + i * 50}; |
||||
cv::Point pt2{30 + i * 60 + 40, 40 + i * 50}; |
||||
|
||||
cv::line(ref_mat, pt1, pt2, color, thick, lt, shift); |
||||
prims.emplace_back(cv::gapi::wip::draw::Line{pt1, pt2, color, thick, lt, shift}); |
||||
} |
||||
|
||||
cv::gapi::wip::draw::render(y, uv, prims); |
||||
cv::cvtColorTwoPlane(y, uv, out_mat, cv::COLOR_YUV2BGR_NV12); |
||||
|
||||
cv::gapi::wip::draw::BGR2NV12(ref_mat, y, uv); |
||||
cv::cvtColorTwoPlane(y, uv, ref_mat, cv::COLOR_YUV2BGR_NV12); |
||||
|
||||
EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat)); |
||||
} |
||||
|
||||
} // opencv_test
|
Loading…
Reference in new issue