序列化 opencv :: Mat

//cvmat_serialization.h
#include 
#include 
using namespace cv;
BOOST_SERIALIZATION_SPLIT_FREE(::cv::Mat)
namespace boost {
  namespace serialization {

    /** Serialization support for cv::Mat */
    template
    void save(Archive & ar, const ::cv::Mat& m, const unsigned int version)
    {
      size_t elem_size = m.elemSize();
      size_t elem_type = m.type();

      ar & m.cols;
      ar & m.rows;
      ar & elem_size;
      ar & elem_type;

      const size_t data_size = m.cols * m.rows * elem_size;
      ar & boost::serialization::make_array(m.ptr(), data_size);
    }

    /** Serialization support for cv::Mat */
    template 
    void load(Archive & ar, ::cv::Mat& m, const unsigned int version)
    {
      int cols, rows;
      size_t elem_size, elem_type;

      ar & cols;
      ar & rows;
      ar & elem_size;
      ar & elem_type;

      m.create(rows, cols, elem_type);

      size_t data_size = m.cols * m.rows * elem_size;
      ar & boost::serialization::make_array(m.ptr(), data_size);
    }

  }
}
//main.cpp
#include 
#include "cvmat_serialization.h"
using namespace std;
void test()
{
   Mat img = imread("/home/xunw/x/img.jpg");
    
  std::ofstream ofs("matrices.bin", std::ios::out | std::ios::binary);

  { // use scope to ensure archive goes out of scope before stream

    boost::archive::binary_oarchive oa(ofs);
    oa << img;
    
  }

  ofs.close();
  Mat imgOut;
  ifstream inf("matrices.bin",std::ios::binary);
  {
   boost::archive::binary_iarchive ia(inf);
   ia >> imgOut;
  }
  
  imshow("img",imgOut);
  waitKey(0);

}
int main()
{
   test();	
}


 
  


你可能感兴趣的:(c++,linux)