ホームページ >バックエンド開発 >C++ >大きな OpenCV マットを効率的にロードするにはどうすればよいですか?

大きな OpenCV マットを効率的にロードするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-02 00:24:09130ブラウズ

How Can I Efficiently Load Large OpenCV Mats?

OpenCV での大きなマットの効率的なロード: 包括的なガイド

大量のメモリを消費する 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 を使用して大きなマットをロードできない場合がありますが、バイナリ ロードが実行可能な解決策となります。

コード例

次のコードは、保存、読み込み、パフォーマンスのための 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。