【问题标题】:boost serialization of opencv types增强 opencv 类型的序列化
【发布时间】:2021-02-06 10:32:44
【问题描述】:

我有一个类(v1 和 v2)的以下成员,我需要使用 boost 序列化将它们序列化为文件,然后在稍后阶段读回。

第一个是opencv类型Point3f的向量,另一个是opencv Vec6f类型的向量,如下图所示。

#include this in the class header 
#include <boost/serialization/vector.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>

//private member variables
std::vector< std::vector<cv::Point3f> > v1;
std::vector< std::vector<cv::Vec6f> > v2;


// Allow serialization to access non-public data members.
friend class boost::serialization::access;

template<class Archive>
  void serialize(Archive & ar, const unsigned int version)
  {
    ar & v1;
    ar & v2;
   
  }

我在头文件的顶部定义了这个,以便它可以理解如何序列化 point3f 和 Vec6f 类型。这是正确的方法吗?我可以保存数据,但是当我将其全部读回时,它具有正确数量的向量数组,但每个条目的值为 0。我做错了什么?我认为这与序列化函数本身有关,但不确定。

namespace boost {
namespace serialization {

template<class Archive>
void serialize(Archive &ar, cv::Point3_<float> pt3, const unsigned int)
{
    ar & pt3.x;
    ar & pt3.y;
    ar & pt3.z;
}

template<class Archive>
void serialize(Archive &ar, cv::Vec<float,6> vec6, const unsigned int)
{
    ar & vec6[0];
    ar & vec6[1];
    ar & vec6[2];
    ar & vec6[3];
    ar & vec6[4];
    ar & vec6[5];
}

}
}

我用这段代码写

std::ofstream ofs1("v1test.bin"); 
boost::archive::binary_oarchive oa1(ofs1);
oa1 << v1;

我用这段代码来阅读

std::ifstream ifs1("v1test.bin");
boost::archive::binary_iarchive ia1(ifs1);        
std::vector< std::vector<cv::Point3f> > test;
ia1 >> test; // this contains the right structure but all values are 0

任何正确方向的帮助或点将不胜感激

【问题讨论】:

    标签: c++ opencv serialization boost


    【解决方案1】:

    我想通了-愚蠢的错误-在传递变量时忘记添加对变量的引用-应该是这样

    namespace boost {
    namespace serialization {
    
    template<class Archive>
    void serialize(Archive &ar, cv::Point3_<float> &pt3, const unsigned int)
    {
        ar & pt3.x;
        ar & pt3.y;
        ar & pt3.z;
    }
    
    template<class Archive>
    void serialize(Archive &ar, cv::Vec<float,6> &vec6, const unsigned int)
    {
        ar & vec6[0];
        ar & vec6[1];
        ar & vec6[2];
        ar & vec6[3];
        ar & vec6[4];
        ar & vec6[5];
    }
    
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2013-11-26
      相关资源
      最近更新 更多