Heim > Backend-Entwicklung > C++ > Ist Binärdatei-E/A eine effizientere Alternative zu FileStorage zum Laden großer OpenCV-Mat-Objekte?

Ist Binärdatei-E/A eine effizientere Alternative zu FileStorage zum Laden großer OpenCV-Mat-Objekte?

Linda Hamilton
Freigeben: 2024-12-05 11:21:17
Original
593 Leute haben es durchsucht

Is Binary File I/O a More Efficient Alternative to FileStorage for Loading Large OpenCV Mat Objects?

Effizientes Laden großer Mat-Objekte mit OpenCV

Das Laden großer Mat-Objekte in den Speicher ist ein häufiger Vorgang in Bildverarbeitungsanwendungen. Obwohl die FileStorage-Methode in OpenCV eine unkomplizierte Option ist, gibt es eine effizientere Alternative?

Schnelleres Laden mit Binärformat

Der Schlüssel zu verbesserter Effizienz liegt im Speichern und Laden der Mat im Binärformat. OpenCV stellt die Matwrite- und Matread-Funktionen speziell für diesen Zweck bereit.

Deutliche Leistungsverbesserung

Tests, die an Mat-Objekten unterschiedlicher Größe durchgeführt wurden, zeigen eine dramatische Leistungsverbesserung bei Verwendung des binären Ladens über FileStorage. Bei einem kleineren Bild (250.000 Zeilen, 192 Spalten) reduzierte das binäre Laden die Ladezeit von 5,5 Sekunden auf nur 50 Millisekunden. Ebenso dauerte das Laden der Binärdatei bei einem größeren Bild (1 Mio. Zeilen, 192 Spalten) nur 197 Millisekunden, während FileStorage aufgrund von Speicherbeschränkungen nicht geladen werden konnte.

Implementierung und Verwendung

Die Funktion matwrite benötigt einen Dateinamen und ein Mat-Objekt als Eingabe, während matread nur den Dateinamen akzeptiert. Die Funktionen übernehmen die erforderliche Header- und Datenspeicherung/-abfrage im Binärformat.

Beispielcode

Hier ist ein Beispielcode, der die Funktionen matwrite und matread demonstriert:

void matwrite(const string& filename, const Mat& mat)
{
    // Header information
    ofstream fs(filename, fstream::binary);
    fs.write((char*)&mat.rows, sizeof(int));
    fs.write((char*)&mat.cols, sizeof(int));
    fs.write((char*)&mat.type(), sizeof(int));
    fs.write((char*)&mat.channels(), sizeof(int));

    // Data
    if (mat.isContinuous())
    {
        fs.write(mat.ptr<char>(0), (mat.dataend - mat.datastart));
    }
    else
    {
        int rowsz = CV_ELEM_SIZE(mat.type()) * mat.cols;
        for (int r = 0; r < mat.rows; ++r)
        {
            fs.write(mat.ptr<char>(r), rowsz);
        }
    }
}

Mat matread(const string&amp; filename)
{
    ifstream fs(filename, fstream::binary);

    // Header information
    int rows, cols, type, channels;
    fs.read((char*)&amp;rows, sizeof(int));
    fs.read((char*)&amp;cols, sizeof(int));
    fs.read((char*)&amp;type, sizeof(int));
    fs.read((char*)&amp;channels, sizeof(int));

    // Data
    Mat mat(rows, cols, type);
    fs.read((char*)mat.data, CV_ELEM_SIZE(type) * rows * cols);
    return mat;
}
Nach dem Login kopieren

Fazit

Verwendung des Binärformats zum Laden großer Mengen Das Einfügen von Objekten in den Speicher bietet im Vergleich zur FileStorage-Methode eine deutliche Leistungssteigerung. Die Funktionen matwrite und matread bieten eine bequeme und effiziente Möglichkeit, diesen Ansatz zu implementieren. Durch die Implementierung dieser Technik können Sie die Ladezeiten verkürzen und die Leistung Ihrer OpenCV-basierten Anwendungen verbessern.

Das obige ist der detaillierte Inhalt vonIst Binärdatei-E/A eine effizientere Alternative zu FileStorage zum Laden großer OpenCV-Mat-Objekte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage