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

大きな OpenCV Mat オブジェクトをメモリに効率的にロードするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 16:09:16627ブラウズ

How Can I Efficiently Load Large OpenCV Mat Objects into Memory?

パフォーマンスの向上: バイナリ ファイルを使用した大規模な Mat オブジェクトの効率的なロード

大規模な Mat オブジェクトをメモリにロードすることは、さまざまな OpenCV アプリケーションにとって重要です。 FileStorage メソッドは一般的なアプローチですが、大規模なデータ セットを処理する場合は最も効率的なオプションではない可能性があります。ここでは、顕著なパフォーマンス向上を約束する代替テクニックを紹介します。

バイナリ形式: 速度と効率の鍵

その秘密は、 での画像の保存と読み込みにあります。バイナリ形式matwrite 関数と matread 関数を使用すると、FileStorage メソッドと比較して顕著な速度向上を達成できます。

ベンチマーク結果: 大きな違い

250K 行 x 192 列の画像を使用して実施されたテストにおいて(CV_8UC1)、パフォーマンスの違いは顕著です:

  • FileStorage: 5523.45 ms
  • バイナリ形式: 50.0879 ms

より大きな画像の場合 (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&amp; filename)
{
    ifstream fs(filename, fstream::binary);
    int rows, cols, type, channels;
    fs.read((char*)&amp;rows, sizeof(int));         // rows
    fs.read((char*)&amp;cols, sizeof(int));         // cols
    fs.read((char*)&amp;type, sizeof(int));         // type
    fs.read((char*)&amp;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 中国語 Web サイトの他の関連記事を参照してください。

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