mirror of
https://github.com/opencv/opencv.git
synced 2026-07-31 08:13:04 +04:00
Merge pull request #18584 from smirnov-alexey:as/rmat_s11n
[G-API]: Introduce RMat serialization API * Introduce RMat serialization API * Fix RunArgs deserialization * Address review comments * Export operators for GRunArg serialization * Fix warning and add handling for RMat in bind() * Update CMakeLists.txt * G-API: RMat S11N -- probably fix the Windows warning
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include "../test_precomp.hpp"
|
||||
|
||||
#include "backends/common/serialization.hpp"
|
||||
#include <opencv2/gapi/rmat.hpp>
|
||||
|
||||
namespace {
|
||||
struct MyCustomType {
|
||||
@@ -45,6 +46,35 @@ template<> struct CompileArgTag<MyCustomType> {
|
||||
} // namespace detail
|
||||
} // namespace cv
|
||||
|
||||
namespace {
|
||||
class MyRMatAdapter : public cv::RMat::Adapter {
|
||||
cv::Mat m_mat;
|
||||
int m_value;
|
||||
std::string m_str;
|
||||
public:
|
||||
MyRMatAdapter() = default;
|
||||
MyRMatAdapter(cv::Mat m, int value, const std::string& str)
|
||||
: m_mat(m), m_value(value), m_str(str)
|
||||
{}
|
||||
virtual cv::RMat::View access(cv::RMat::Access access) override {
|
||||
if (access == cv::RMat::Access::W) {
|
||||
return cv::RMat::View(cv::descr_of(m_mat), m_mat.data, m_mat.step);
|
||||
} else {
|
||||
return cv::RMat::View(cv::descr_of(m_mat), m_mat.data, m_mat.step);
|
||||
}
|
||||
}
|
||||
virtual cv::GMatDesc desc() const override { return cv::descr_of(m_mat); }
|
||||
virtual void serialize(cv::gapi::s11n::IOStream& os) override {
|
||||
os << m_value << m_str;
|
||||
}
|
||||
virtual void deserialize(cv::gapi::s11n::IIStream& is) override {
|
||||
is >> m_value >> m_str;
|
||||
}
|
||||
int getVal() { return m_value; }
|
||||
std::string getStr() { return m_str; }
|
||||
};
|
||||
}
|
||||
|
||||
namespace opencv_test {
|
||||
|
||||
struct S11N_Basic: public ::testing::Test {
|
||||
@@ -460,6 +490,39 @@ TEST_F(S11N_Basic, Test_Bind_RunArgs_MatScalar) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(S11N_Basic, Test_RunArg_RMat) {
|
||||
cv::Mat mat = cv::Mat::eye(cv::Size(128, 64), CV_8UC3);
|
||||
cv::RMat rmat = cv::make_rmat<MyRMatAdapter>(mat, 42, "It actually works");
|
||||
auto v = cv::GRunArgs{ cv::GRunArg{ rmat } };
|
||||
|
||||
const std::vector<char> sargsin = cv::gapi::serialize(v);
|
||||
cv::GRunArgs out = cv::gapi::deserialize<cv::GRunArgs, MyRMatAdapter>(sargsin);
|
||||
cv::RMat out_mat = cv::util::get<cv::RMat>(out[0]);
|
||||
auto adapter = out_mat.get<MyRMatAdapter>();
|
||||
EXPECT_EQ(42, adapter->getVal());
|
||||
EXPECT_EQ("It actually works", adapter->getStr());
|
||||
}
|
||||
|
||||
TEST_F(S11N_Basic, Test_RunArg_RMat_Scalar_Mat) {
|
||||
cv::Mat mat = cv::Mat::eye(cv::Size(128, 64), CV_8UC3);
|
||||
cv::RMat rmat = cv::make_rmat<MyRMatAdapter>(mat, 42, "It actually works");
|
||||
cv::Scalar sc(111);
|
||||
auto v = cv::GRunArgs{ cv::GRunArg{ rmat }, cv::GRunArg{ sc }, cv::GRunArg{ mat } };
|
||||
|
||||
const std::vector<char> sargsin = cv::gapi::serialize(v);
|
||||
cv::GRunArgs out = cv::gapi::deserialize<cv::GRunArgs, MyRMatAdapter>(sargsin);
|
||||
cv::RMat out_rmat = cv::util::get<cv::RMat>(out[0]);
|
||||
auto adapter = out_rmat.get<MyRMatAdapter>();
|
||||
EXPECT_EQ(42, adapter->getVal());
|
||||
EXPECT_EQ("It actually works", adapter->getStr());
|
||||
|
||||
cv::Scalar out_sc = cv::util::get<cv::Scalar>(out[1]);
|
||||
EXPECT_EQ(sc, out_sc);
|
||||
|
||||
cv::Mat out_mat = cv::util::get<cv::Mat>(out[2]);
|
||||
EXPECT_EQ(0, cv::norm(mat, out_mat));
|
||||
}
|
||||
|
||||
namespace {
|
||||
template <cv::detail::OpaqueKind K, typename T>
|
||||
bool verifyOpaqueKind(T&& in) {
|
||||
|
||||
Reference in New Issue
Block a user