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 ?
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& filename) { ifstream fs(filename, fstream::binary); // Header information int rows, cols, type, channels; fs.read((char*)&rows, sizeof(int)); fs.read((char*)&cols, sizeof(int)); fs.read((char*)&type, sizeof(int)); fs.read((char*)&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!