gpt4 book ai didi

c++ - 序列化 OpenCV Mat_

转载 作者:IT老高 更新时间:2023-10-28 22:17:31 25 4
gpt4 key购买 nike

我正在从事一个机器人研究项目,我需要序列化 ​​3D 点的 2D 矩阵:基本上每个像素都是一个 3 vector 的 float 。这些像素保存在 OpenCV 矩阵中,需要通过进程间通信发送并保存到文件中,以便在多台计算机上处​​理。我想以 endian/architecture-independent、space-efficient 的方式尽快将它们序列化。 cv::imencode here将是完美的,除了它只适用于 8 位和 16 位元素,我们不想失去任何精度。这些文件不需要是人类可读的(尽管我们现在这样做是为了确保数据的可移植性,而且速度非常慢)。有没有这方面的最佳实践,或者优雅的方式来做到这一点?

谢谢!

最佳答案

较早的答案很好,但它们不适用于当您想要序列化感兴趣的区域时出现的非连续矩阵(除其他外)。此外,不需要序列化 ​​elemSize(),因为这是从 type 值派生的。

这里有一些代码无论连续性如何都可以工作(带有包含/命名空间)

#pragma once

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/utility.hpp>
#include <opencv2/opencv.hpp>

namespace boost {
namespace serialization {

template<class Archive>
void serialize(Archive &ar, cv::Mat& mat, const unsigned int)
{
int cols, rows, type;
bool continuous;

if (Archive::is_saving::value) {
cols = mat.cols; rows = mat.rows; type = mat.type();
continuous = mat.isContinuous();
}

ar & cols & rows & type & continuous;

if (Archive::is_loading::value)
mat.create(rows, cols, type);

if (continuous) {
const unsigned int data_size = rows * cols * mat.elemSize();
ar & boost::serialization::make_array(mat.ptr(), data_size);
} else {
const unsigned int row_size = cols*mat.elemSize();
for (int i = 0; i < rows; i++) {
ar & boost::serialization::make_array(mat.ptr(i), row_size);
}
}

}

} // namespace serialization
} // namespace boost

关于c++ - 序列化 OpenCV Mat_<Vec3f>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4170745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com