Path: blob/master/modules/gapi/test/gapi_fluid_test.cpp
16337 views
// This file is part of OpenCV project.1// It is subject to the license terms in the LICENSE file found in the top-level directory2// of this distribution and at http://opencv.org/license.html.3//4// Copyright (C) 2018 Intel Corporation567#include "test_precomp.hpp"89#include "opencv2/gapi/core.hpp"1011#include "opencv2/gapi/fluid/gfluidbuffer.hpp"12#include "opencv2/gapi/fluid/gfluidkernel.hpp"1314// FIXME: move these tests with priv() to internal suite15#include "backends/fluid/gfluidbuffer_priv.hpp"1617#include "gapi_fluid_test_kernels.hpp"18#include "logger.hpp"1920namespace opencv_test21{2223using namespace cv::gapi_test_kernels;2425namespace26{27void WriteFunction(uint8_t* row, int nr, int w) {28for (int i = 0; i < w; i++)29row[i] = static_cast<uint8_t>(nr+i);30};31void ReadFunction1x1(const uint8_t* row, int w) {32for (int i = 0; i < w; i++)33std::cout << std::setw(4) << static_cast<int>(row[i]) << " ";34std::cout << "\n";35};36void ReadFunction3x3(const uint8_t* rows[3], int w) {37for (int i = 0; i < 3; i++) {38for (int j = -1; j < w+1; j++) {39std::cout << std::setw(4) << static_cast<int>(rows[i][j]) << " ";40}41std::cout << "\n";42}43std::cout << "\n";44};45}4647TEST(FluidBuffer, InputTest)48{49const cv::Size buffer_size = {8,8};50cv::Mat in_mat = cv::Mat::eye(buffer_size, CV_8U);5152cv::gapi::fluid::Buffer buffer(to_own(in_mat), true);53cv::gapi::fluid::View view = buffer.mkView(1, 0, {}, false);54view.priv().reset(1);55int this_y = 0;5657while (this_y < buffer_size.height)58{59const uint8_t* rrow = view.InLine<uint8_t>(0);60ReadFunction1x1(rrow, buffer_size.width);61view.priv().readDone(1,1);6263cv::Mat from_buffer(1, buffer_size.width, CV_8U, const_cast<uint8_t*>(rrow));64EXPECT_EQ(0, cv::countNonZero(in_mat.row(this_y) != from_buffer));6566this_y++;67}68}6970TEST(FluidBuffer, CircularTest)71{72const cv::Size buffer_size = {8,16};7374cv::gapi::fluid::Buffer buffer(cv::GMatDesc{CV_8U,1,buffer_size}, 3, 1, 0, 1,75util::make_optional(cv::gapi::fluid::Border{cv::BORDER_CONSTANT, cv::gapi::own::Scalar(255)}));76cv::gapi::fluid::View view = buffer.mkView(3, 1, {}, false);77view.priv().reset(3);78buffer.debug(std::cout);7980const auto whole_line_is = [](const uint8_t *line, int len, int value)81{82return std::all_of(line, line+len, [&](const uint8_t v){return v == value;});83};8485// Store all read/written data in separate Mats to compare with86cv::Mat written_data(buffer_size, CV_8U);8788// Simulate write/read process89int num_reads = 0, num_writes = 0;90while (num_reads < buffer_size.height)91{92if (num_writes < buffer_size.height)93{94uint8_t* wrow = buffer.OutLine<uint8_t>();95WriteFunction(wrow, num_writes, buffer_size.width);96buffer.priv().writeDone();9798cv::Mat(1, buffer_size.width, CV_8U, wrow)99.copyTo(written_data.row(num_writes));100num_writes++;101}102buffer.debug(std::cout);103104if (view.ready())105{106view.priv().prepareToRead();107const uint8_t* rrow[3] = {108view.InLine<uint8_t>(-1),109view.InLine<uint8_t>( 0),110view.InLine<uint8_t>( 1),111};112ReadFunction3x3(rrow, buffer_size.width);113view.priv().readDone(1,3);114buffer.debug(std::cout);115116// Check borders right here117EXPECT_EQ(255u, rrow[0][-1]);118EXPECT_EQ(255u, rrow[0][buffer_size.width]);119if (num_reads == 0)120{121EXPECT_TRUE(whole_line_is(rrow[0]-1, buffer_size.width+2, 255u));122}123if (num_reads == buffer_size.height-1)124{125EXPECT_TRUE(whole_line_is(rrow[2]-1, buffer_size.width+2, 255u));126}127128// Check window (without borders)129if (num_reads > 0 && num_reads < buffer_size.height-1)130{131// +1 everywhere since num_writes was just incremented above132cv::Mat written_lastLine2 = written_data.row(num_writes - (2+1));133cv::Mat written_lastLine1 = written_data.row(num_writes - (1+1));134cv::Mat written_lastLine0 = written_data.row(num_writes - (0+1));135136cv::Mat read_prevLine(1, buffer_size.width, CV_8U, const_cast<uint8_t*>(rrow[0]));137cv::Mat read_thisLine(1, buffer_size.width, CV_8U, const_cast<uint8_t*>(rrow[1]));138cv::Mat read_nextLine(1, buffer_size.width, CV_8U, const_cast<uint8_t*>(rrow[2]));139140EXPECT_EQ(0, cv::countNonZero(written_lastLine2 != read_prevLine));141EXPECT_EQ(0, cv::countNonZero(written_lastLine1 != read_thisLine));142EXPECT_EQ(0, cv::countNonZero(written_lastLine0 != read_nextLine));143}144num_reads++;145}146}147}148149TEST(FluidBuffer, OutputTest)150{151const cv::Size buffer_size = {8,16};152cv::Mat out_mat = cv::Mat(buffer_size, CV_8U);153154cv::gapi::fluid::Buffer buffer(to_own(out_mat), false);155int num_writes = 0;156while (num_writes < buffer_size.height)157{158uint8_t* wrow = buffer.OutLine<uint8_t>();159WriteFunction(wrow, num_writes, buffer_size.width);160buffer.priv().writeDone();161num_writes++;162}163164GAPI_LOG_INFO(NULL, "\n" << out_mat);165166// Validity check167for (int r = 0; r < buffer_size.height; r++)168{169for (int c = 0; c < buffer_size.width; c++)170{171EXPECT_EQ(r+c, out_mat.at<uint8_t>(r, c));172}173}174}175176TEST(Fluid, AddC_WithScalar)177{178cv::GMat in;179cv::GScalar s;180181cv::GComputation c(cv::GIn(in, s), cv::GOut(TAddScalar::on(in, s)));182cv::Mat in_mat = cv::Mat::eye(3, 3, CV_8UC1), out_mat(3, 3, CV_8UC1), ref_mat;183cv::Scalar in_s(100);184185auto cc = c.compile(cv::descr_of(in_mat), cv::descr_of(in_s), cv::compile_args(fluidTestPackage));186187cc(cv::gin(in_mat, in_s), cv::gout(out_mat));188ref_mat = in_mat + in_s;189EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat));190}191192TEST(Fluid, Scalar_In_Middle_Graph)193{194cv::GMat in;195cv::GScalar s;196197cv::GComputation c(cv::GIn(in, s), cv::GOut(TAddScalar::on(TAddCSimple::on(in, 5), s)));198cv::Mat in_mat = cv::Mat::eye(3, 3, CV_8UC1), out_mat(3, 3, CV_8UC1), ref_mat;199cv::Scalar in_s(100);200201auto cc = c.compile(cv::descr_of(in_mat), cv::descr_of(in_s), cv::compile_args(fluidTestPackage));202203cc(cv::gin(in_mat, in_s), cv::gout(out_mat));204ref_mat = (in_mat + 5) + in_s;205EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat));206}207208TEST(Fluid, Add_Scalar_To_Mat)209{210cv::GMat in;211cv::GScalar s;212213cv::GComputation c(cv::GIn(s, in), cv::GOut(TAddScalarToMat::on(s, in)));214cv::Mat in_mat = cv::Mat::eye(3, 3, CV_8UC1), out_mat(3, 3, CV_8UC1), ref_mat;215cv::Scalar in_s(100);216217auto cc = c.compile(cv::descr_of(in_s), cv::descr_of(in_mat), cv::compile_args(fluidTestPackage));218219cc(cv::gin(in_s, in_mat), cv::gout(out_mat));220ref_mat = in_mat + in_s;221EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat));222}223224TEST(Fluid, Sum_2_Mats_And_Scalar)225{226cv::GMat a, b;227cv::GScalar s;228229cv::GComputation c(cv::GIn(a, s, b), cv::GOut(TSum2MatsAndScalar::on(a, s, b)));230cv::Mat in_mat1 = cv::Mat::eye(3, 3, CV_8UC1),231in_mat2 = cv::Mat::eye(3, 3, CV_8UC1),232out_mat(3, 3, CV_8UC1),233ref_mat;234cv::Scalar in_s(100);235236auto cc = c.compile(cv::descr_of(in_mat1), cv::descr_of(in_s), cv::descr_of(in_mat2), cv::compile_args(fluidTestPackage));237238cc(cv::gin(in_mat1, in_s, in_mat2), cv::gout(out_mat));239ref_mat = in_mat1 + in_mat2 + in_s;240EXPECT_EQ(0, cv::countNonZero(out_mat != ref_mat));241}242243TEST(Fluid, Split3)244{245cv::GMat bgr;246cv::GMat r,g,b;247std::tie(b,g,r) = cv::gapi::split3(bgr);248auto rr = TAddSimple::on(r, TId::on(b));249auto rrr = TAddSimple::on(TId::on(rr), g);250cv::GComputation c(bgr, TId::on(rrr));251252cv::Size sz(5120, 5120);253cv::Mat eye_1 = cv::Mat::eye(sz, CV_8UC1);254std::vector<cv::Mat> eyes = {eye_1, eye_1, eye_1};255cv::Mat in_mat;256cv::merge(eyes, in_mat);257cv::Mat out_mat(sz, CV_8UC1);258259// G-API260auto cc = c.compile(cv::descr_of(in_mat),261cv::compile_args(fluidTestPackage));262cc(in_mat, out_mat);263264// OCV265std::vector<cv::Mat> chans;266cv::split(in_mat, chans);267268// Compare269EXPECT_EQ(0, cv::countNonZero(out_mat != (chans[2]*3)));270}271272TEST(Fluid, ScratchTest)273{274cv::GMat in;275cv::GMat out = TPlusRow0::on(TPlusRow0::on(in));276cv::GComputation c(in, out);277278cv::Size sz(8, 8);279cv::Mat in_mat = cv::Mat::eye(sz, CV_8UC1);280cv::Mat out_mat(sz, CV_8UC1);281282// OpenCV (reference)283cv::Mat ref;284{285cv::Mat first_row = cv::Mat::zeros(1, sz.width, CV_8U);286cv::Mat remaining = cv::repeat(in_mat.row(0), sz.height-1, 1);287cv::Mat operand;288cv::vconcat(first_row, 2*remaining, operand);289ref = in_mat + operand;290}291GAPI_LOG_INFO(NULL, "\n" << ref);292293// G-API294auto cc = c.compile(cv::descr_of(in_mat),295cv::compile_args(fluidTestPackage));296cc(in_mat, out_mat);297GAPI_LOG_INFO(NULL, "\n" << out_mat);298EXPECT_EQ(0, cv::countNonZero(ref != out_mat));299300cc(in_mat, out_mat);301GAPI_LOG_INFO(NULL, "\n" << out_mat);302EXPECT_EQ(0, cv::countNonZero(ref != out_mat));303}304305TEST(Fluid, MultipleOutRowsTest)306{307cv::GMat in;308cv::GMat out = TAddCSimple::on(TAddCSimple::on(in, 1), 2);309cv::GComputation c(in, out);310311cv::Size sz(4, 4);312cv::Mat in_mat = cv::Mat::eye(sz, CV_8UC1);313cv::Mat out_mat(sz, CV_8UC1);314315auto cc = c.compile(cv::descr_of(in_mat),316cv::compile_args(fluidTestPackage));317cc(in_mat, out_mat);318319std::cout << out_mat << std::endl;320321cv::Mat ocv_ref = in_mat + 1 + 2;322EXPECT_EQ(0, cv::countNonZero(ocv_ref != out_mat));323}324325326TEST(Fluid, LPIWindow)327{328cv::GMat in;329cv::GMat r,g,b;330std::tie(r,g,b) = cv::gapi::split3(in);331cv::GMat rr = TId7x7::on(r);332cv::GMat tmp = TAddSimple::on(rr, g);333cv::GMat out = TAddSimple::on(tmp, b);334335cv::GComputation c(in, out);336337cv::Size sz(8, 8);338339cv::Mat eye_1 = cv::Mat::eye(sz, CV_8UC1);340std::vector<cv::Mat> eyes = {eye_1, eye_1, eye_1};341cv::Mat in_mat;342cv::merge(eyes, in_mat);343344cv::Mat out_mat(sz, CV_8U);345auto cc = c.compile(cv::descr_of(in_mat), cv::compile_args(fluidTestPackage));346cc(in_mat, out_mat);347348//std::cout << out_mat << std::endl;349350// OpenCV reference351cv::Mat ocv_ref = eyes[0]+eyes[1]+eyes[2];352353EXPECT_EQ(0, cv::countNonZero(ocv_ref != out_mat));354}355356TEST(Fluid, MultipleReaders_SameLatency)357{358// in -> AddC -> a -> AddC -> b -> Add -> out359// '--> AddC -> c -'360//361// b and c have the same skew362363cv::GMat in;364cv::GMat a = TAddCSimple::on(in, 1); // FIXME - align naming (G, non-G)365cv::GMat b = TAddCSimple::on(a, 2);366cv::GMat c = TAddCSimple::on(a, 3);367cv::GMat out = TAddSimple::on(b, c);368cv::GComputation comp(in, out);369370const auto sz = cv::Size(32, 32);371cv::Mat in_mat = cv::Mat::eye(sz, CV_8UC1);372cv::Mat out_mat_gapi(sz, CV_8UC1);373cv::Mat out_mat_ocv (sz, CV_8UC1);374375// Run G-API376auto cc = comp.compile(cv::descr_of(in_mat), cv::compile_args(fluidTestPackage));377cc(in_mat, out_mat_gapi);378379// Check with OpenCV380cv::Mat tmp = in_mat + 1;381out_mat_ocv = (tmp+2) + (tmp+3);382EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv));383}384385TEST(Fluid, MultipleReaders_DifferentLatency)386{387// in1 -> AddC -> a -> AddC -------------> b -> Add -> out388// '--------------> Add --> c -'389// '--> Id7x7-> d -'390//391// b and c have different skew (due to latency introduced by Id7x7)392// a is ready by multiple views with different latency.393394cv::GMat in;395cv::GMat a = TAddCSimple::on(in, 1); // FIXME - align naming (G, non-G)396cv::GMat b = TAddCSimple::on(a, 2);397cv::GMat d = TId7x7::on(a);398cv::GMat c = TAddSimple::on(a, d);399cv::GMat out = TAddSimple::on(b, c);400cv::GComputation comp(in, out);401402const auto sz = cv::Size(32, 32);403cv::Mat in_mat = cv::Mat::eye(sz, CV_8UC1);404cv::Mat out_mat_gapi(sz, CV_8UC1);405406// Run G-API407auto cc = comp.compile(cv::descr_of(in_mat), cv::compile_args(fluidTestPackage));408cc(in_mat, out_mat_gapi);409410// Check with OpenCV411cv::Mat ocv_a = in_mat + 1;412cv::Mat ocv_b = ocv_a + 2;413cv::Mat ocv_d = ocv_a;414cv::Mat ocv_c = ocv_a + ocv_d;415cv::Mat out_mat_ocv = ocv_b + ocv_c;416EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv));417}418419TEST(Fluid, MultipleOutputs)420{421// in -> AddC -> a -> AddC ------------------> out1422// `--> Id7x7 --> b --> AddC -> out2423424cv::GMat in;425cv::GMat a = TAddCSimple::on(in, 1);426cv::GMat b = TId7x7::on(a);427cv::GMat out1 = TAddCSimple::on(a, 2);428cv::GMat out2 = TAddCSimple::on(b, 7);429cv::GComputation comp(cv::GIn(in), cv::GOut(out1, out2));430431const auto sz = cv::Size(32, 32);432cv::Mat in_mat = cv::Mat::eye(sz, CV_8UC1);433cv::Mat out_mat_gapi1(sz, CV_8UC1), out_mat_gapi2(sz, CV_8UC1);434cv::Mat out_mat_ocv1(sz, CV_8UC1), out_mat_ocv2(sz, CV_8UC1);435436// Run G-API437auto cc = comp.compile(cv::descr_of(in_mat), cv::compile_args(fluidTestPackage));438cc(cv::gin(in_mat), cv::gout(out_mat_gapi1, out_mat_gapi2));439440// Check with OpenCV441out_mat_ocv1 = in_mat + 1 + 2;442out_mat_ocv2 = in_mat + 1 + 7;443EXPECT_EQ(0, cv::countNonZero(out_mat_gapi1 != out_mat_ocv1));444EXPECT_EQ(0, cv::countNonZero(out_mat_gapi2 != out_mat_ocv2));445}446447TEST(Fluid, EmptyOutputMatTest)448{449cv::GMat in;450cv::GMat out = TAddCSimple::on(in, 2);451cv::GComputation c(in, out);452453cv::Mat in_mat = cv::Mat::eye(cv::Size(32, 24), CV_8UC1);454cv::Mat out_mat;455456auto cc = c.compile(cv::descr_of(in_mat), cv::compile_args(fluidTestPackage));457458cc(in_mat, out_mat);459EXPECT_EQ(CV_8UC1, out_mat.type());460EXPECT_EQ(32, out_mat.cols);461EXPECT_EQ(24, out_mat.rows);462EXPECT_TRUE(out_mat.ptr() != nullptr);463}464465struct LPISequenceTest : public TestWithParam<int>{};466TEST_P(LPISequenceTest, LPISequenceTest)467{468// in -> AddC -> a -> Blur (2lpi) -> out469470int kernelSize = GetParam();471cv::GMat in;472cv::GMat a = TAddCSimple::on(in, 1);473auto blur = kernelSize == 3 ? &TBlur3x3_2lpi::on : &TBlur5x5_2lpi::on;474cv::GMat out = blur(a, cv::BORDER_CONSTANT, cv::Scalar(0));475cv::GComputation comp(cv::GIn(in), cv::GOut(out));476477const auto sz = cv::Size(8, 10);478cv::Mat in_mat = cv::Mat::eye(sz, CV_8UC1);479cv::Mat out_mat_gapi(sz, CV_8UC1);480cv::Mat out_mat_ocv(sz, CV_8UC1);481482// Run G-API483auto cc = comp.compile(cv::descr_of(in_mat), cv::compile_args(fluidTestPackage));484cc(cv::gin(in_mat), cv::gout(out_mat_gapi));485486// Check with OpenCV487cv::blur(in_mat + 1, out_mat_ocv, {kernelSize,kernelSize}, {-1,-1}, cv::BORDER_CONSTANT);488EXPECT_EQ(0, cv::countNonZero(out_mat_gapi != out_mat_ocv));489}490491INSTANTIATE_TEST_CASE_P(Fluid, LPISequenceTest,492Values(3, 5));493494struct InputImageBorderTest : public TestWithParam <std::tuple<int, int>> {};495TEST_P(InputImageBorderTest, InputImageBorderTest)496{497cv::Size sz_in = { 320, 240 };498499int ks = 0;500int borderType = 0;501std::tie(ks, borderType) = GetParam();502cv::Mat in_mat1(sz_in, CV_8UC1);503cv::Scalar mean = cv::Scalar(127.0f);504cv::Scalar stddev = cv::Scalar(40.f);505506cv::randn(in_mat1, mean, stddev);507508cv::Size kernelSize = {ks, ks};509cv::Point anchor = {-1, -1};510cv::Scalar borderValue(0);511512auto gblur = ks == 3 ? &TBlur3x3::on : &TBlur5x5::on;513514GMat in;515auto out = gblur(in, borderType, borderValue);516517Mat out_mat_gapi = Mat::zeros(sz_in, CV_8UC1);518519GComputation c(GIn(in), GOut(out));520auto cc = c.compile(descr_of(in_mat1), cv::compile_args(fluidTestPackage));521cc(gin(in_mat1), gout(out_mat_gapi));522523cv::Mat out_mat_ocv = Mat::zeros(sz_in, CV_8UC1);524cv::blur(in_mat1, out_mat_ocv, kernelSize, anchor, borderType);525526EXPECT_EQ(0, countNonZero(out_mat_ocv != out_mat_gapi));527}528529INSTANTIATE_TEST_CASE_P(Fluid, InputImageBorderTest,530Combine(Values(3, 5),531Values(BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT_101)));532533struct SequenceOfBlursTest : public TestWithParam <std::tuple<int>> {};534TEST_P(SequenceOfBlursTest, Test)535{536cv::Size sz_in = { 320, 240 };537538int borderType = 0;;539std::tie(borderType) = GetParam();540cv::Mat in_mat(sz_in, CV_8UC1);541cv::Scalar mean = cv::Scalar(127.0f);542cv::Scalar stddev = cv::Scalar(40.f);543544cv::randn(in_mat, mean, stddev);545546cv::Point anchor = {-1, -1};547cv::Scalar borderValue(0);548549GMat in;550auto mid = TBlur3x3::on(in, borderType, borderValue);551auto out = TBlur5x5::on(mid, borderType, borderValue);552553Mat out_mat_gapi = Mat::zeros(sz_in, CV_8UC1);554555GComputation c(GIn(in), GOut(out));556auto cc = c.compile(descr_of(in_mat), cv::compile_args(fluidTestPackage));557cc(gin(in_mat), gout(out_mat_gapi));558559cv::Mat mid_mat_ocv = Mat::zeros(sz_in, CV_8UC1);560cv::Mat out_mat_ocv = Mat::zeros(sz_in, CV_8UC1);561cv::blur(in_mat, mid_mat_ocv, {3,3}, anchor, borderType);562cv::blur(mid_mat_ocv, out_mat_ocv, {5,5}, anchor, borderType);563564EXPECT_EQ(0, countNonZero(out_mat_ocv != out_mat_gapi));565}566567INSTANTIATE_TEST_CASE_P(Fluid, SequenceOfBlursTest,568Values(BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT_101));569570struct TwoBlursTest : public TestWithParam <std::tuple<int, int, int, int, int, int, bool>> {};571TEST_P(TwoBlursTest, Test)572{573cv::Size sz_in = { 320, 240 };574575int kernelSize1 = 0, kernelSize2 = 0;576int borderType1 = -1, borderType2 = -1;577cv::Scalar borderValue1{}, borderValue2{};578bool readFromInput = false;579std::tie(kernelSize1, borderType1, borderValue1, kernelSize2, borderType2, borderValue2, readFromInput) = GetParam();580cv::Mat in_mat(sz_in, CV_8UC1);581cv::Scalar mean = cv::Scalar(127.0f);582cv::Scalar stddev = cv::Scalar(40.f);583584cv::randn(in_mat, mean, stddev);585586cv::Point anchor = {-1, -1};587588auto blur1 = kernelSize1 == 3 ? &TBlur3x3::on : TBlur5x5::on;589auto blur2 = kernelSize2 == 3 ? &TBlur3x3::on : TBlur5x5::on;590591GMat in, out1, out2;592if (readFromInput)593{594out1 = blur1(in, borderType1, borderValue1);595out2 = blur2(in, borderType2, borderValue2);596}597else598{599auto mid = TAddCSimple::on(in, 0);600out1 = blur1(mid, borderType1, borderValue1);601out2 = blur2(mid, borderType2, borderValue2);602}603604Mat out_mat_gapi1 = Mat::zeros(sz_in, CV_8UC1);605Mat out_mat_gapi2 = Mat::zeros(sz_in, CV_8UC1);606607GComputation c(GIn(in), GOut(out1, out2));608auto cc = c.compile(descr_of(in_mat), cv::compile_args(fluidTestPackage));609cc(gin(in_mat), gout(out_mat_gapi1, out_mat_gapi2));610611cv::Mat out_mat_ocv1 = Mat::zeros(sz_in, CV_8UC1);612cv::Mat out_mat_ocv2 = Mat::zeros(sz_in, CV_8UC1);613cv::blur(in_mat, out_mat_ocv1, {kernelSize1, kernelSize1}, anchor, borderType1);614cv::blur(in_mat, out_mat_ocv2, {kernelSize2, kernelSize2}, anchor, borderType2);615616EXPECT_EQ(0, countNonZero(out_mat_ocv1 != out_mat_gapi1));617EXPECT_EQ(0, countNonZero(out_mat_ocv2 != out_mat_gapi2));618}619620INSTANTIATE_TEST_CASE_P(Fluid, TwoBlursTest,621Combine(Values(3, 5),622Values(cv::BORDER_CONSTANT, cv::BORDER_REPLICATE, cv::BORDER_REFLECT_101),623Values(0),624Values(3, 5),625Values(cv::BORDER_CONSTANT, cv::BORDER_REPLICATE, cv::BORDER_REFLECT_101),626Values(0),627testing::Bool())); // Read from input directly or place a copy node at start628629struct TwoReadersTest : public TestWithParam <std::tuple<int, int, int, bool>> {};630TEST_P(TwoReadersTest, Test)631{632cv::Size sz_in = { 320, 240 };633634int kernelSize = 0;635int borderType = -1;636cv::Scalar borderValue;637bool readFromInput = false;638std::tie(kernelSize, borderType, borderValue, readFromInput) = GetParam();639cv::Mat in_mat(sz_in, CV_8UC1);640cv::Scalar mean = cv::Scalar(127.0f);641cv::Scalar stddev = cv::Scalar(40.f);642643cv::randn(in_mat, mean, stddev);644645cv::Point anchor = {-1, -1};646647auto blur = kernelSize == 3 ? &TBlur3x3::on : TBlur5x5::on;648649GMat in, out1, out2;650if (readFromInput)651{652out1 = TAddCSimple::on(in, 0);653out2 = blur(in, borderType, borderValue);654}655else656{657auto mid = TAddCSimple::on(in, 0);658out1 = TAddCSimple::on(mid, 0);659out2 = blur(mid, borderType, borderValue);660}661662Mat out_mat_gapi1 = Mat::zeros(sz_in, CV_8UC1);663Mat out_mat_gapi2 = Mat::zeros(sz_in, CV_8UC1);664665GComputation c(GIn(in), GOut(out1, out2));666auto cc = c.compile(descr_of(in_mat), cv::compile_args(fluidTestPackage));667cc(gin(in_mat), gout(out_mat_gapi1, out_mat_gapi2));668669cv::Mat out_mat_ocv1 = Mat::zeros(sz_in, CV_8UC1);670cv::Mat out_mat_ocv2 = Mat::zeros(sz_in, CV_8UC1);671out_mat_ocv1 = in_mat;672cv::blur(in_mat, out_mat_ocv2, {kernelSize, kernelSize}, anchor, borderType);673674EXPECT_EQ(0, countNonZero(out_mat_ocv1 != out_mat_gapi1));675EXPECT_EQ(0, countNonZero(out_mat_ocv2 != out_mat_gapi2));676}677678INSTANTIATE_TEST_CASE_P(Fluid, TwoReadersTest,679Combine(Values(3, 5),680Values(cv::BORDER_CONSTANT, cv::BORDER_REPLICATE, cv::BORDER_REFLECT_101),681Values(0),682testing::Bool())); // Read from input directly or place a copy node at start683684TEST(FluidTwoIslands, SanityTest)685{686cv::Size sz_in{8,8};687688GMat in1, in2;689auto out1 = TAddScalar::on(in1, {0});690auto out2 = TAddScalar::on(in2, {0});691692cv::Mat in_mat1(sz_in, CV_8UC1);693cv::Mat in_mat2(sz_in, CV_8UC1);694cv::Scalar mean = cv::Scalar(127.0f);695cv::Scalar stddev = cv::Scalar(40.f);696697cv::randn(in_mat1, mean, stddev);698cv::randn(in_mat2, mean, stddev);699700Mat out_mat1 = Mat::zeros(sz_in, CV_8UC1);701Mat out_mat2 = Mat::zeros(sz_in, CV_8UC1);702703GComputation c(GIn(in1, in2), GOut(out1, out2));704EXPECT_NO_THROW(c.apply(gin(in_mat1, in_mat2), gout(out_mat1, out_mat2), cv::compile_args(fluidTestPackage)));705EXPECT_EQ(0, countNonZero(in_mat1 != out_mat1));706EXPECT_EQ(0, countNonZero(in_mat2 != out_mat2));707}708709} // namespace opencv_test710711712