Maison >développement back-end >C++ >Comment puis-je charger efficacement de grands tapis OpenCV ?

Comment puis-je charger efficacement de grands tapis OpenCV ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-02 00:24:09210parcourir

How Can I Efficiently Load Large OpenCV Mats?

Chargement efficace de grands tapis dans OpenCV : un guide complet

Lorsque vous traitez des objets Mat étendus et gourmands en mémoire, l'efficacité de leur chargement devient primordial. Bien que la méthode FileStorage d'OpenCV fournisse une approche simple, elle peut ne pas toujours suffire.

Alternative : chargement de données binaires

Pour des performances considérablement améliorées, envisagez d'enregistrer et de charger des objets Mat dans un format binaire brut. Cela contourne la surcharge associée à FileStorage, ce qui entraîne un gain de temps substantiel.

Implémentation avec les fonctions matwrite et matread

Pour implémenter le chargement binaire, utilisez les fonctions matwrite et matread :

void matwrite(const string& filename, const Mat& mat) { ... }
Mat matread(const string& filename) { ... }

Performances Comparaison

Les benchmarks révèlent une grande différence dans les vitesses de chargement entre FileStorage et le chargement binaire :

Using FileStorage: 5523.45 ms
Using Raw:         50.0879 ms

Using FileStorage: (out of memory)
Using Raw:         197.381 ms

Notes supplémentaires

  • Les mesures de performances doivent être effectuées en mode release, et non en mode débogage.
  • Les limitations de mémoire peuvent empêcher charger de grands Mats à l'aide de FileStorage, tandis que le chargement binaire offre une solution viable.

Exemple de code

Le code suivant démontre l'utilisation de matwrite et matread pour la sauvegarde, chargement et tests de performances :

#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>

using namespace std;
using namespace cv;

int main() {
    // Save randomly generated data
    Mat m(1024*256, 192, CV_8UC1);
    randu(m, 0, 1000);

    matwrite("raw.bin", m);

    // Load saved matrix
    double tic = getTickCount();
    Mat m1 = matread("raw.bin");

    // Calculate loading time
    double toc = (getTickCount() - tic) * 1000. / getTickFrequency();
    cout << "Using Raw: " << toc << " ms" << endl;
}

En utilisant le chargement binaire pour les gros objets Mat, vous pouvez améliorer considérablement l'efficacité et réduire les temps de chargement, optimiser vos applications OpenCV pour des performances optimales.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn