Wie im Titel, ich habe std::vector<cv::Mat> matrices
, die ich schreiben/lesen zu/von Binärdatei.Schreiben Sie einen Vektor von cv :: Mat in Binärdatei in C++
Jetzt, nach this Antwort, alles, was ich für das Schreiben tun sollte, ist, ist:
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();
jedoch folgende this Antwort scheint cv::Mat
Objekte zu schreiben ein wenig kompliziert, und in der Antwort matRead
und matWrite
das tun Job. So frage ich mich, wenn anstelle des obigen Code ich etwas tun sollte wie:
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]);
jedoch nicht dieser Code nicht funktionieren, da matWrite()
überschreibt matrices.bin
bei jedem Zyklus, also sollte ich die Größe von matrices[i]
hängen als Offset vor dem Schreiben Matrix selbst.
Was soll ich tun?
UPDATE:
ich mit dieser Lösung kam, matWrite
und matRead
mit optionalen Argumenten Umschreiben für Matrizen beim Schreiben und Start Anfügen von einem bestimmten Punkt zu lesen:
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;
}
und Funktionen Angerufen mit:
//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);
}
Ich bin wirklich neugierig zu wissen, warum jemand mir eine downvote für diesen questio – justHelloWorld
auf dem Duplikat Einen Hinweis gab. Sie können durch jede Matrix in Ihrem Vektor iterieren und "matappend" verwenden. – Miki
Wenn das Duplikat nicht hilft, lass es mich wissen. Aber jetzt sollten Sie in der Lage sein, eine korrekte Funktion selbst zu schreiben – Miki