Maison > développement back-end > C++ > Comment puis-je charger efficacement de gros objets OpenCV Mat en mémoire ?

Comment puis-je charger efficacement de gros objets OpenCV Mat en mémoire ?

Susan Sarandon
Libérer: 2024-12-05 16:09:16
original
592 Les gens l'ont consulté

How Can I Efficiently Load Large OpenCV Mat Objects into Memory?

Amélioration des performances : chargement efficace d'objets Mat volumineux à l'aide de fichiers binaires

Le chargement d'objets Mat massifs en mémoire est crucial pour diverses applications OpenCV. Bien que la méthode FileStorage soit une approche courante, elle n'est peut-être pas l'option la plus efficace pour gérer de grands ensembles de données. Voici une technique alternative qui promet une amélioration notable des performances.

Format binaire : la clé de la rapidité et de l'efficacité

Le secret réside dans la sauvegarde et le chargement des images dans format binaire. En utilisant les fonctions matwrite et matread, nous pouvons réaliser des gains de vitesse remarquables par rapport à la méthode FileStorage.

Résultats de benchmarking : un monde de différence

Dans des tests effectués avec une image de 250 000 lignes x 192 colonnes (CV_8UC1), la différence de performances est frappante :

  • FileStorage : 5523,45 ms
  • Format binaire : 50,0879 ms

Pour une image plus grande (1M de lignes x 192 colonnes), la méthode FileStorage a échoué en raison de erreurs de mémoire insuffisante, tandis que le mode binaire les a gérées sans effort en seulement 197,381 ms.

Implémentation du code : simplifiée et efficace

Voici l'extrait de code avec le matwrite et matread, ainsi qu'un test pour illustrent leurs gains de performances :

void matwrite(const string& filename, const Mat& mat)
{
    ofstream fs(filename, fstream::binary);
    fs.write((char*)&mat.rows, sizeof(int));    // rows
    fs.write((char*)&mat.cols, sizeof(int));    // cols
    fs.write((char*)&mat.type, sizeof(int));        // type
    fs.write((char*)&mat.channels, sizeof(int));    // channels
    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);
    int rows, cols, type, channels;
    fs.read((char*)&amp;rows, sizeof(int));         // rows
    fs.read((char*)&amp;cols, sizeof(int));         // cols
    fs.read((char*)&amp;type, sizeof(int));         // type
    fs.read((char*)&amp;channels, sizeof(int));     // channels
    Mat mat(rows, cols, type);
    fs.read((char*)mat.data, CV_ELEM_SIZE(type) * rows * cols);
    return mat;
}
Copier après la connexion

Conclusion : débloquer un nouveau niveau de performances

En adoptant le format de fichier binaire, vous bénéficiez d'un avantage significatif en termes de performances lors du chargement de gros Mat objets en mémoire. Cette technique peut réduire considérablement les temps de chargement, permettant à vos applications de fonctionner plus efficacement avec des ensembles de données volumineux.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal