Path: blob/master/modules/gapi/test/gapi_fluid_test_kernels.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 Corporation56#include "test_precomp.hpp"78#include <iomanip>9#include "gapi_fluid_test_kernels.hpp"10#include <opencv2/gapi/core.hpp>1112namespace cv13{14namespace gapi_test_kernels15{1617GAPI_FLUID_KERNEL(FAddSimple, TAddSimple, false)18{19static const int Window = 1;2021static void run(const cv::gapi::fluid::View &a,22const cv::gapi::fluid::View &b,23cv::gapi::fluid::Buffer &o)24{25// std::cout << "AddSimple {{{\n";26// std::cout << " a - "; a.debug(std::cout);27// std::cout << " b - "; b.debug(std::cout);28// std::cout << " o - "; o.debug(std::cout);2930const uint8_t* in1 = a.InLine<uint8_t>(0);31const uint8_t* in2 = b.InLine<uint8_t>(0);32uint8_t* out = o.OutLine<uint8_t>();3334// std::cout << "a: ";35// for (int i = 0, w = a.length(); i < w; i++)36// {37// std::cout << std::setw(4) << int(in1[i]);38// }39// std::cout << "\n";4041// std::cout << "b: ";42// for (int i = 0, w = a.length(); i < w; i++)43// {44// std::cout << std::setw(4) << int(in2[i]);45// }46// std::cout << "\n";4748for (int i = 0, w = a.length(); i < w; i++)49{50out[i] = in1[i] + in2[i];51}5253// std::cout << "}}} " << std::endl;;54}55};5657GAPI_FLUID_KERNEL(FAddCSimple, TAddCSimple, false)58{59static const int Window = 1;60static const int LPI = 2;6162static void run(const cv::gapi::fluid::View &in,63const int cval,64cv::gapi::fluid::Buffer &out)65{66for (int l = 0, lpi = out.lpi(); l < lpi; l++)67{68const uint8_t* in_row = in .InLine <uint8_t>(l);69uint8_t* out_row = out.OutLine<uint8_t>(l);70//std::cout << "l=" << l << ": ";71for (int i = 0, w = in.length(); i < w; i++)72{73//std::cout << std::setw(4) << int(in_row[i]);74out_row[i] = static_cast<uint8_t>(in_row[i] + cval);75}76//std::cout << std::endl;77}78}79};8081GAPI_FLUID_KERNEL(FAddScalar, TAddScalar, false)82{83static const int Window = 1;84static const int LPI = 2;8586static void run(const cv::gapi::fluid::View &in,87const cv::Scalar &cval,88cv::gapi::fluid::Buffer &out)89{90for (int l = 0, lpi = out.lpi(); l < lpi; l++)91{92const uint8_t* in_row = in .InLine <uint8_t>(l);93uint8_t* out_row = out.OutLine<uint8_t>(l);94std::cout << "l=" << l << ": ";95for (int i = 0, w = in.length(); i < w; i++)96{97std::cout << std::setw(4) << int(in_row[i]);98out_row[i] = static_cast<uint8_t>(in_row[i] + cval[0]);99}100std::cout << std::endl;101}102}103};104105GAPI_FLUID_KERNEL(FAddScalarToMat, TAddScalarToMat, false)106{107static const int Window = 1;108static const int LPI = 2;109110static void run(const cv::Scalar &cval,111const cv::gapi::fluid::View &in,112cv::gapi::fluid::Buffer &out)113{114for (int l = 0, lpi = out.lpi(); l < lpi; l++)115{116const uint8_t* in_row = in .InLine <uint8_t>(l);117uint8_t* out_row = out.OutLine<uint8_t>(l);118std::cout << "l=" << l << ": ";119for (int i = 0, w = in.length(); i < w; i++)120{121std::cout << std::setw(4) << int(in_row[i]);122out_row[i] = static_cast<uint8_t>(in_row[i] + cval[0]);123}124std::cout << std::endl;125}126}127};128129template<int kernelSize, int lpi = 1>130static void runBlur(const cv::gapi::fluid::View& src, cv::gapi::fluid::Buffer& dst)131{132const auto borderSize = (kernelSize - 1) / 2;133const unsigned char* ins[kernelSize];134135for (int l = 0; l < lpi; l++)136{137for (int i = 0; i < kernelSize; i++)138{139ins[i] = src.InLine<unsigned char>(i - borderSize + l);140}141142auto out = dst.OutLine<unsigned char>(l);143const auto width = dst.length();144145for (int w = 0; w < width; w++)146{147float res = 0.0f;148for (int i = 0; i < kernelSize; i++)149{150for (int j = -borderSize; j < borderSize + 1; j++)151{152res += ins[i][w+j];153}154}155out[w] = static_cast<unsigned char>(std::rint(res / (kernelSize * kernelSize)));156}157}158}159160GAPI_FLUID_KERNEL(FBlur1x1, TBlur1x1, false)161{162static const int Window = 1;163164static void run(const cv::gapi::fluid::View &src, int /*borderType*/,165cv::Scalar /*borderValue*/, cv::gapi::fluid::Buffer &dst)166{167runBlur<Window>(src, dst);168}169};170171GAPI_FLUID_KERNEL(FBlur3x3, TBlur3x3, false)172{173static const int Window = 3;174175static void run(const cv::gapi::fluid::View &src, int /*borderType*/,176cv::Scalar /*borderValue*/, cv::gapi::fluid::Buffer &dst)177{178runBlur<Window>(src, dst);179}180181static cv::gapi::fluid::Border getBorder(const cv::GMatDesc &/*src*/, int borderType, cv::Scalar borderValue)182{183return { borderType, to_own(borderValue)};184}185};186187GAPI_FLUID_KERNEL(FBlur5x5, TBlur5x5, false)188{189static const int Window = 5;190191static void run(const cv::gapi::fluid::View &src, int /*borderType*/,192cv::Scalar /*borderValue*/, cv::gapi::fluid::Buffer &dst)193{194runBlur<Window>(src, dst);195}196197static cv::gapi::fluid::Border getBorder(const cv::GMatDesc &/*src*/, int borderType, cv::Scalar borderValue)198{199return { borderType, to_own(borderValue)};200}201};202203GAPI_FLUID_KERNEL(FBlur3x3_2lpi, TBlur3x3_2lpi, false)204{205static const int Window = 3;206static const int LPI = 2;207208static void run(const cv::gapi::fluid::View &src, int /*borderType*/,209cv::Scalar /*borderValue*/, cv::gapi::fluid::Buffer &dst)210{211runBlur<Window, LPI>(src, dst);212}213214static cv::gapi::fluid::Border getBorder(const cv::GMatDesc &/*src*/, int borderType, cv::Scalar borderValue)215{216return { borderType, to_own(borderValue)};217}218};219220GAPI_FLUID_KERNEL(FBlur5x5_2lpi, TBlur5x5_2lpi, false)221{222static const int Window = 5;223static const int LPI = 2;224225static void run(const cv::gapi::fluid::View &src, int /*borderType*/,226cv::Scalar /*borderValue*/, cv::gapi::fluid::Buffer &dst)227{228runBlur<Window, LPI>(src, dst);229}230231static cv::gapi::fluid::Border getBorder(const cv::GMatDesc &/*src*/, int borderType, cv::Scalar borderValue)232{233return { borderType, to_own(borderValue )};234}235};236237GAPI_FLUID_KERNEL(FIdentity, TId, false)238{239static const int Window = 3;240241static void run(const cv::gapi::fluid::View &a,242cv::gapi::fluid::Buffer &o)243{244const uint8_t* in[3] = {245a.InLine<uint8_t>(-1),246a.InLine<uint8_t>( 0),247a.InLine<uint8_t>(+1)248};249uint8_t* out = o.OutLine<uint8_t>();250251// ReadFunction3x3(in, a.length());252for (int i = 0, w = a.length(); i < w; i++)253{254out[i] = in[1][i];255}256}257258static gapi::fluid::Border getBorder(const cv::GMatDesc &)259{260return { cv::BORDER_REPLICATE, cv::gapi::own::Scalar{} };261}262};263264GAPI_FLUID_KERNEL(FId7x7, TId7x7, false)265{266static const int Window = 7;267static const int LPI = 2;268269static void run(const cv::gapi::fluid::View &a,270cv::gapi::fluid::Buffer &o)271{272for (int l = 0, lpi = o.lpi(); l < lpi; l++)273{274const uint8_t* in[Window] = {275a.InLine<uint8_t>(-3 + l),276a.InLine<uint8_t>(-2 + l),277a.InLine<uint8_t>(-1 + l),278a.InLine<uint8_t>( 0 + l),279a.InLine<uint8_t>(+1 + l),280a.InLine<uint8_t>(+2 + l),281a.InLine<uint8_t>(+3 + l),282};283uint8_t* out = o.OutLine<uint8_t>(l);284285// std::cout << "Id7x7 " << l << " of " << lpi << " {{{\n";286// std::cout << " a - "; a.debug(std::cout);287// std::cout << " o - "; o.debug(std::cout);288// std::cout << "}}} " << std::endl;;289290// // std::cout << "Id7x7 at " << a.y() << "/L" << l << " {{{" << std::endl;291// for (int j = 0; j < Window; j++)292// {293// // std::cout << std::setw(2) << j-(Window-1)/2 << ": ";294// for (int i = 0, w = a.length(); i < w; i++)295// std::cout << std::setw(4) << int(in[j][i]);296// std::cout << std::endl;297// }298// std::cout << "}}}" << std::endl;299300for (int i = 0, w = a.length(); i < w; i++)301out[i] = in[(Window-1)/2][i];302}303}304305static cv::gapi::fluid::Border getBorder(const cv::GMatDesc&/* src*/)306{307return { cv::BORDER_REPLICATE, cv::gapi::own::Scalar{} };308}309};310311GAPI_FLUID_KERNEL(FPlusRow0, TPlusRow0, true)312{313static const int Window = 1;314315static void initScratch(const cv::GMatDesc &in,316cv::gapi::fluid::Buffer &scratch)317{318cv::Size scratch_size{in.size.width, 1};319cv::gapi::fluid::Buffer buffer(in.withSize(scratch_size));320scratch = std::move(buffer);321}322323static void resetScratch(cv::gapi::fluid::Buffer &scratch)324{325// FIXME: only 1 line can be used!326uint8_t* out_row = scratch.OutLine<uint8_t>();327for (int i = 0, w = scratch.length(); i < w; i++)328{329out_row[i] = 0;330}331}332333static void run(const cv::gapi::fluid::View &in,334cv::gapi::fluid::Buffer &out,335cv::gapi::fluid::Buffer &scratch)336{337const uint8_t* in_row = in .InLine <uint8_t>(0);338uint8_t* out_row = out .OutLine<uint8_t>();339uint8_t* tmp_row = scratch.OutLine<uint8_t>();340341if (in.y() == 0)342{343// Copy 1st row to scratch buffer344for (int i = 0, w = in.length(); i < w; i++)345{346out_row[i] = in_row[i];347tmp_row[i] = in_row[i];348}349}350else351{352// Output is 1st row + in353for (int i = 0, w = in.length(); i < w; i++)354{355out_row[i] = in_row[i] + tmp_row[i];356}357}358}359};360361GAPI_FLUID_KERNEL(FTestSplit3, cv::gapi::core::GSplit3, false)362{363static const int Window = 1;364365static void run(const cv::gapi::fluid::View &in,366cv::gapi::fluid::Buffer &o1,367cv::gapi::fluid::Buffer &o2,368cv::gapi::fluid::Buffer &o3)369{370// std::cout << "Split3 {{{\n";371// std::cout << " a - "; in.debug(std::cout);372// std::cout << " 1 - "; o1.debug(std::cout);373// std::cout << " 2 - "; o2.debug(std::cout);374// std::cout << " 3 - "; o3.debug(std::cout);375// std::cout << "}}} " << std::endl;;376377const uint8_t* in_rgb = in.InLine<uint8_t>(0);378uint8_t* out_r = o1.OutLine<uint8_t>();379uint8_t* out_g = o2.OutLine<uint8_t>();380uint8_t* out_b = o3.OutLine<uint8_t>();381382for (int i = 0, w = in.length(); i < w; i++)383{384out_r[i] = in_rgb[3*i];385out_g[i] = in_rgb[3*i+1];386out_b[i] = in_rgb[3*i+2];387}388}389};390391GAPI_FLUID_KERNEL(FSum2MatsAndScalar, TSum2MatsAndScalar, false)392{393static const int Window = 1;394static const int LPI = 2;395396static void run(const cv::gapi::fluid::View &a,397const cv::Scalar &cval,398const cv::gapi::fluid::View &b,399cv::gapi::fluid::Buffer &out)400{401for (int l = 0, lpi = out.lpi(); l < lpi; l++)402{403const uint8_t* in_row1 = a .InLine <uint8_t>(l);404const uint8_t* in_row2 = b .InLine <uint8_t>(l);405uint8_t* out_row = out.OutLine<uint8_t>(l);406std::cout << "l=" << l << ": ";407for (int i = 0, w = a.length(); i < w; i++)408{409std::cout << std::setw(4) << int(in_row1[i]);410std::cout << std::setw(4) << int(in_row2[i]);411out_row[i] = static_cast<uint8_t>(in_row1[i] + in_row2[i] + cval[0]);412}413std::cout << std::endl;414}415}416};417418cv::gapi::GKernelPackage fluidTestPackage = cv::gapi::kernels419<FAddSimple420,FAddCSimple421,FAddScalar422,FAddScalarToMat423,FBlur1x1424,FBlur3x3425,FBlur5x5426,FBlur3x3_2lpi427,FBlur5x5_2lpi428,FIdentity429,FId7x7430,FPlusRow0431,FSum2MatsAndScalar432,FTestSplit3433>();434} // namespace gapi_test_kernels435} // namespace cv436437438