//cvmat_serialization.h
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/vector.hpp>
using namespace cv;
BOOST_SERIALIZATION_SPLIT_FREE(::cv::Mat)
namespace boost {
namespace serialization {
/** Serialization support for cv::Mat */
template<class Archive>
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 <class Archive>
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);
}
}
}
<pre name="code" class="cpp">//main.cpp
#include <fstream>
#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();
}