Merge pull request #15312 from smirnov-alexey:gapi_fluid_garray

* Support GArray as input in fluid kernels

* Create tests on GArray input in fluid

* Some fixes to fully support GArray

* Refactor code and change the kernel according to review

* Add histogram calculation as a G-API kernel

Add assert that input GArgs in fluid contain at least one GMat
This commit is contained in:
Alexey Smirnov
2019-09-02 15:51:58 +03:00
committed by Alexander Alekhin
parent e98e58c65a
commit 8a7e74673e
6 changed files with 106 additions and 2 deletions
@@ -1229,6 +1229,7 @@ void cv::gimpl::GFluidExecutable::bindInArg(const cv::gimpl::RcDesc &rc, const G
{
case GShape::GMAT: m_buffers[m_id_map.at(rc.id)].priv().bindTo(util::get<cv::gapi::own::Mat>(arg), true); break;
case GShape::GSCALAR: m_res.slot<cv::gapi::own::Scalar>()[rc.id] = util::get<cv::gapi::own::Scalar>(arg); break;
case GShape::GARRAY: m_res.slot<cv::detail::VectorRef>()[rc.id] = util::get<cv::detail::VectorRef>(arg); break;
default: util::throw_error(std::logic_error("Unsupported GShape type"));
}
}
@@ -1254,7 +1255,8 @@ void cv::gimpl::GFluidExecutable::bindOutArg(const cv::gimpl::RcDesc &rc, const
void cv::gimpl::GFluidExecutable::packArg(cv::GArg &in_arg, const cv::GArg &op_arg)
{
GAPI_Assert(op_arg.kind != cv::detail::ArgKind::GMAT
&& op_arg.kind != cv::detail::ArgKind::GSCALAR);
&& op_arg.kind != cv::detail::ArgKind::GSCALAR
&& op_arg.kind != cv::detail::ArgKind::GARRAY);
if (op_arg.kind == cv::detail::ArgKind::GOBJREF)
{
@@ -1263,6 +1265,10 @@ void cv::gimpl::GFluidExecutable::packArg(cv::GArg &in_arg, const cv::GArg &op_a
{
in_arg = GArg(m_res.slot<cv::gapi::own::Scalar>()[ref.id]);
}
else if (ref.shape == GShape::GARRAY)
{
in_arg = GArg(m_res.slot<cv::detail::VectorRef>()[ref.id]);
}
}
}
@@ -128,7 +128,7 @@ class GFluidExecutable final: public GIslandExecutable
std::vector<FluidAgent*> m_script;
using Magazine = detail::magazine<cv::gapi::own::Scalar>;
using Magazine = detail::magazine<cv::gapi::own::Scalar, cv::detail::VectorRef>;
Magazine m_res;
std::size_t m_num_int_buffers; // internal buffers counter (m_buffers - num_scratch)