如标题所述,我有一个std ::vector<cv::Mat> matrices
,我想将其写入/从二进制文件中读取。
现在,遵循此答案,我所要做的就是进行以下操作:
ofstream fout("matrices.bin", ios::out | ios::binary);
size_t size = matrices.size();
fout.write((char*)&size, sizeof(size));
fout.write((char*)&matrices[0], v.size() * sizeof(cv::Mat));
fout.close();
然而,根据这个答案,写入
cv::Mat
对象似乎有点棘手,在答案中,matRead
和matWrite
完成了工作。因此,我想知道是否应该像下面这样做,而不是上面的代码:ofstream fout("matrices.bin", ios::out | ios::binary);
size_t size = matrices.size();
fout.write((char*)&size, sizeof(size));
for(size_t i = 0 ; i < matrices.size() ; i++)
matWrite("matrices.bin", matrices[i]);
然而,由于
matWrite()
在每个周期都会覆盖matrices.bin
,所以这段代码无法正常工作,因此在写入矩阵本身之前,我应该附加matrices[i]
的大小作为偏移量。
我该怎么办?
更新:
我想到了这个解决方案,使用可选参数重写matWrite
和matRead
,用于在写入期间追加矩阵并从特定点开始读取:
void matwrite(const std::string& filename, const cv::Mat& mat, const bool append = false) {
std::ofstream fs;
if(append)
fs.open(filename.c_str(), std::fstream::binary | std::fstream::app);
else
fs.open(filename.c_str(), std::fstream::binary);
//the rest of matwrite is the same...
}
cv::Mat matRead(const std::string& filename, size_t &offset = 0)
{
std::ifstream fs(filename, std::fstream::binary);
fs.seekg(offset);
...
offset += 4 * sizeof(int) + CV_ELEM_SIZE(type) * rows * cols; //update offset //move offset of 4 ints and mat size
return mat;
}
函数的调用方式如下:
//writing:
for(size_t i = 0 ; i<v.size() ; i++)
writemat(filename, v[i], true);
//reading:
size_t offset = 0;
for(size_t i = 0 ; i<size ; i++){ // size = v.size() during writing
cv::Mat mat = matRead(filename, offset);
v.push_back(mat);
}
matAppend
我们可以编写一个大矩阵,该矩阵是向量中所有矩阵的串联。然而,从获得的.bin
文件开始重建原始向量是不可能的。简而言之,我们可以将std::vector<cv :: Mat>
作为一个大的cv :: Mat
写入文件,但我们无法再次获得std::vector<cv :: Mat>
。 - justHelloWorld