提升性能:使用二进制文件高效加载大型 Mat 对象
将大量 Mat 对象加载到内存中对于各种 OpenCV 应用程序至关重要。虽然 FileStorage 方法是一种常见方法,但它可能不是处理大型数据集的最有效选项。这是一种有望显着提高性能的替代技术。
二进制格式:速度和效率的关键
秘密在于在 中保存和加载图像二进制格式。与 FileStorage 方法相比,使用 matwrite 和 matread 函数,我们可以获得显着的速度提升。
基准测试结果:天壤之别
使用 250K 行 x 192 列图像进行的测试(CV_8UC1),性能差异是惊人的:
对于更大的图像(1M 行) x 192 列),FileStorage 方法因以下原因失败内存不足错误,而二进制模式只需 197.381 毫秒即可轻松处理。
代码实现:简化且有效
这里是带有 matwrite 和 matread 函数,以及说明其功能的测试性能提升:
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; }
结论:解锁新的性能水平
通过采用二进制文件格式,在将大型 Mat 对象加载到其中时,您可以获得显着的性能优势记忆。这项技术可以大大减少加载时间,使您的应用程序能够更有效地处理海量数据集。以上是如何有效地将大型 OpenCV Mat 对象加载到内存中?的详细内容。更多信息请关注PHP中文网其他相关文章!