首页 >后端开发 >C++ >如何高效加载大型 OpenCV 垫子?

如何高效加载大型 OpenCV 垫子?

Susan Sarandon
Susan Sarandon原创
2024-12-02 00:24:09129浏览

How Can I Efficiently Load Large OpenCV Mats?

OpenCV 中大型 Mat 的高效加载:综合指南

处理大量内存密集型 Mat 对象时,加载它们的效率变得最重要的。虽然 OpenCV 的 FileStorage 方法提供了一种简单的方法,但它可能并不总是足够。

替代方案:二进制数据加载

为了显着提高性能,请考虑在中保存和加载 Mat 对象原始二进制格式。这绕过了与 FileStorage 相关的开销,从而节省了大量时间。

使用 matwrite 和 matread 函数实现

要实现二进制加载,请利用 matwrite 和 matread 函数:

void matwrite(const string& filename, const Mat& mat) { ... }
Mat matread(const string& filename) { ... }

性能比较

基准测试显示 FileStorage 和二进制加载之间的加载速度存在巨大差异:

Using FileStorage: 5523.45 ms
Using Raw:         50.0879 ms

Using FileStorage: (out of memory)
Using Raw:         197.381 ms

附加说明

  • 性能测量应在发布模式下进行,而不是调试模式。
  • 内存限制可能会阻止使用 FileStorage 加载大型 Mat,而二进制加载提供了可行的解决方案。

代码示例

以下代码演示了如何使用 matwrite 和 matread 进行保存、加载和性能测试:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>

using namespace std;
using namespace cv;

int main() {
    // Save randomly generated data
    Mat m(1024*256, 192, CV_8UC1);
    randu(m, 0, 1000);

    matwrite("raw.bin", m);

    // Load saved matrix
    double tic = getTickCount();
    Mat m1 = matread("raw.bin");

    // Calculate loading time
    double toc = (getTickCount() - tic) * 1000. / getTickFrequency();
    cout << "Using Raw: " << toc << " ms" << endl;
}

通过对大型 Mat 对象采用二进制加载,您可以显着提高效率并减少加载时间,从而优化 OpenCV 应用程序以获得最佳性能。

以上是如何高效加载大型 OpenCV 垫子?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn