diff --git a/modules/gapi/include/opencv2/gapi/media.hpp b/modules/gapi/include/opencv2/gapi/media.hpp index f27cb80913..3d7f5a5b65 100644 --- a/modules/gapi/include/opencv2/gapi/media.hpp +++ b/modules/gapi/include/opencv2/gapi/media.hpp @@ -30,9 +30,21 @@ public: View access(Access) const; cv::GFrameDesc desc() const; + // Cast underlying MediaFrame adapter to the particular adapter type, + // return nullptr if underlying type is different + template T* get() const + { + static_assert(std::is_base_of::value, + "T is not derived from cv::MediaFrame::IAdapter!"); + auto* adapter = getAdapter(); + GAPI_Assert(adapter != nullptr); + return dynamic_cast(adapter); + } + private: struct Priv; std::shared_ptr m; + IAdapter* getAdapter() const; }; template diff --git a/modules/gapi/src/api/media.cpp b/modules/gapi/src/api/media.cpp index 212902ee3b..3c171b215f 100644 --- a/modules/gapi/src/api/media.cpp +++ b/modules/gapi/src/api/media.cpp @@ -26,6 +26,10 @@ cv::MediaFrame::View cv::MediaFrame::access(Access code) const { return m->adapter->access(code); } +cv::MediaFrame::IAdapter* cv::MediaFrame::getAdapter() const { + return m->adapter.get(); +} + cv::MediaFrame::View::View(Ptrs&& ptrs, Strides&& strs, Callback &&cb) : ptr (std::move(ptrs)) , stride(std::move(strs)) diff --git a/modules/gapi/src/backends/ie/giebackend.cpp b/modules/gapi/src/backends/ie/giebackend.cpp index 2a26f0c329..3af09d4381 100644 --- a/modules/gapi/src/backends/ie/giebackend.cpp +++ b/modules/gapi/src/backends/ie/giebackend.cpp @@ -126,25 +126,20 @@ inline IE::TensorDesc toIE(const cv::Mat &mat, cv::gapi::ie::TraitAs hint) { if (sz.dims() == 2 && hint == cv::gapi::ie::TraitAs::IMAGE) { // NB: This logic is mainly taken from IE samples - const size_t pixsz = CV_ELEM_SIZE1(mat.type()); const size_t channels = mat.channels(); const size_t height = mat.size().height; const size_t width = mat.size().width; - const size_t strideH = mat.step.buf[0]; - const size_t strideW = mat.step.buf[1]; + const size_t strideH = mat.step[0]; - const bool is_dense = - strideW == pixsz * channels && - strideH == strideW * width; - - if (!is_dense) - cv::util::throw_error(std::logic_error("Doesn't support conversion" - " from non-dense cv::Mat")); + IE::BlockingDesc bdesc({1, height, width, channels} /* dims */, + {0, 2, 3, 1} /* order for NHWC */, + 0 /* offset */, + {0, 0, 0, 0} /* offsets for dims */, + {strideH * height, strideH, channels, 1} /* strides for dims */); return IE::TensorDesc(toIE(mat.depth()), - IE::SizeVector{1, channels, height, width}, - IE::Layout::NHWC); + IE::SizeVector{1, channels, height, width}, bdesc); } return IE::TensorDesc(toIE(mat.depth()), toIE(sz), toIELayout(sz.dims()));