diff --git a/modules/gapi/include/opencv2/gapi/cpu/gcpukernel.hpp b/modules/gapi/include/opencv2/gapi/cpu/gcpukernel.hpp index eb5f784747..2763d17eaf 100644 --- a/modules/gapi/include/opencv2/gapi/cpu/gcpukernel.hpp +++ b/modules/gapi/include/opencv2/gapi/cpu/gcpukernel.hpp @@ -443,7 +443,12 @@ struct OCVStCallHelper, std::tuple> : template static void call_impl(GCPUContext &ctx, detail::Seq, detail::Seq) { - auto& st = *ctx.state().get>(); + auto state_ptr = ctx.state().get>(); + if (state_ptr == nullptr) { + CV_Error(cv::Error::StsNullPtr, "Stateful kernel's state is not initialized. " + "Make sure the setup() function properly initializes the state."); + } + auto& st = *state_ptr; call_and_postprocess::get(ctx, IIs))...> ::call(st, get_in::get(ctx, IIs)..., get_out::get(ctx, OIs)...); } diff --git a/modules/gapi/test/cpu/gapi_ocv_stateful_kernel_tests.cpp b/modules/gapi/test/cpu/gapi_ocv_stateful_kernel_tests.cpp index b9985e1377..1ee419aa2c 100644 --- a/modules/gapi/test/cpu/gapi_ocv_stateful_kernel_tests.cpp +++ b/modules/gapi/test/cpu/gapi_ocv_stateful_kernel_tests.cpp @@ -103,8 +103,10 @@ namespace GAPI_OCV_KERNEL_ST(GOCVStInvalidResize, GStInvalidResize, int) { static void setup(const cv::GMatDesc, cv::Size, double, double, int, - std::shared_ptr &/* state */) - { } + std::shared_ptr &state) + { + state = std::make_shared(); + } static void run(const cv::Mat& in, cv::Size sz, double fx, double fy, int interp, cv::Mat &out, int& /* state */) @@ -150,9 +152,10 @@ namespace GAPI_OCV_KERNEL_ST(GOCVCountStateSetups, GCountStateSetups, int) { - static void setup(const cv::GMatDesc &, std::shared_ptr &, + static void setup(const cv::GMatDesc &, std::shared_ptr &state, const cv::GCompileArgs &compileArgs) { + state = std::make_shared(); auto params = cv::gapi::getCompileArg(compileArgs) .value_or(CountStateSetupsParams { }); if (params.pSetupsCount != nullptr) {