Как и в названии, у меня есть std::vector<cv::Mat> matrices
, который я хочу написать/прочитать в/из двоичного файла.Напишите вектор cv :: Mat для двоичного файла в C++
Теперь, после this ответа, все, что я должен сделать для Сочинения:
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();
Однако после this ответа, писать 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]
, как смещение перед записью самой матрицы.
Что мне делать?
UPDATE:
Я пришел к этому решению, переписывание 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);
}
Я действительно интересно знать, почему кто-то дал мне downvote для этого Questio – justHelloWorld
записку о дубликате. Вы можете перебирать каждую матрицу в своем векторе и использовать «matappend». – Miki
Если дубликат не помогает, дайте мне знать. Однако теперь вы должны иметь возможность написать правильную функцию самостоятельно – Miki