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 :
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& filename) { ifstream fs(filename, fstream::binary); int rows, cols, type, channels; fs.read((char*)&rows, sizeof(int)); // rows fs.read((char*)&cols, sizeof(int)); // cols fs.read((char*)&type, sizeof(int)); // type fs.read((char*)&channels, sizeof(int)); // channels Mat mat(rows, cols, type); fs.read((char*)mat.data, CV_ELEM_SIZE(type) * rows * cols); return mat; }
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!