【问题标题】:How to serialize OpenCV Mat with boost XML archive如何使用 boost XML 存档序列化 OpenCV Mat
【发布时间】:2013-04-14 02:00:35
【问题描述】:

我正在尝试序列化一个具有 cv::Mat 作为成员的对象,我发现了这个 SO page 但是当我尝试它时,我收到以下错误:

usr/include/boost/archive/basic_xml_iarchive.hpp:70:9:错误:否 调用的匹配函数 'assertion_failed(mpl_::failed************ boost::序列化::is_wrapper::************) 注意:模板 int mpl_::assertion_failed(typename mpl_::assert::type) /usr/include/boost/archive/basic_xml_iarchive.hpp: 在成员函数'void boost::archive::basic_xml_iarchive::load_override(T&, int) [with T = unsigned char, Archive = boost::archive::xml_iarchive] ':'

在链接页面的示例中,他们使用二进制存档,而我使用的是 xml 存档,这会导致问题吗?

【问题讨论】:

    标签: c++ opencv serialization boost


    【解决方案1】:

    需要在包含的标题中的某处添加:

    namespace boost {
      namespace serialization {
    
    
        template<class Archive>
        inline void serialize(Archive & ar, cv::Mat& m, const unsigned int version) {
          int cols = m.cols;
          int rows = m.rows;
          size_t elemSize = m.elemSize();
          size_t elemType = m.type();
    
          ar & BOOST_SERIALIZATION_NVP(cols);
          ar & BOOST_SERIALIZATION_NVP(rows);
          ar & BOOST_SERIALIZATION_NVP(elemSize);
          ar & BOOST_SERIALIZATION_NVP(elemType); // element type.
    
          if(m.type() != elemType || m.rows != rows || m.cols != cols) {
            m = cv::Mat(rows, cols, elemType, cv::Scalar(0));
          }
    
          size_t dataSize = cols * rows * elemSize;
          cout << " datasize is " << dataSize;
    
    
          for (size_t dc = 0; dc < dataSize; dc++) {
            std::stringstream ss;
            ss << "elem_"<<dc;
            ar & boost::serialization::make_nvp(ss.str().c_str(), m.data[dc]);
          }
    
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多