Maison >développement back-end >C++ >Les E/S de fichiers binaires sont-elles une alternative plus efficace à FileStorage pour charger de gros objets Mat OpenCV ?

Les E/S de fichiers binaires sont-elles une alternative plus efficace à FileStorage pour charger de gros objets Mat OpenCV ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-05 11:21:17589parcourir

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

Chargement efficace d'objets Mat de grande taille avec OpenCV

Le chargement d'objets Mat de grande taille en mémoire est une opération courante dans les applications de traitement d'image. Bien que la méthode FileStorage dans OpenCV soit une option simple, existe-t-il une alternative plus efficace ?

Chargement plus rapide avec le format binaire

La clé d'une efficacité améliorée réside dans la sauvegarde et chargement du Mat au format binaire. OpenCV fournit les fonctions matwrite et matread spécifiquement à cet effet.

Amélioration significative des performances

Les tests effectués sur des objets Mat de différentes tailles montrent une amélioration spectaculaire des performances lors de l'utilisation du chargement binaire. sur FileStorage. Pour une image plus petite (250 000 lignes, 192 colonnes), le chargement binaire a réduit le temps de chargement de 5,5 secondes à seulement 50 millisecondes. De même, pour une image plus grande (1 million de lignes, 192 colonnes), le chargement binaire n'a pris que 197 millisecondes, tandis que FileStorage n'a pas pu se charger en raison de limitations de mémoire.

Mise en œuvre et utilisation

La fonction matwrite prend un nom de fichier et un objet Mat en entrée, tandis que matread ne prend que le nom de fichier. Les fonctions gèrent l'en-tête nécessaire et le stockage/récupération des données au format binaire.

Exemple de code

Voici un exemple de code qui illustre les fonctions matwrite et matread :

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;
}

Conclusion

Utilisation du format binaire pour le chargement de gros Placer des objets en mémoire offre une amélioration significative des performances par rapport à la méthode FileStorage. Les fonctions matwrite et matread constituent un moyen pratique et efficace de mettre en œuvre cette approche. En mettant en œuvre cette technique, vous pouvez réduire les temps de chargement et améliorer les performances de vos applications basées sur OpenCV.

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