ホームページ >バックエンド開発 >C++ >バイナリ ファイル I/O は、大きな OpenCV Mat オブジェクトをロードするための FileStorage のより効率的な代替手段ですか?

バイナリ ファイル I/O は、大きな OpenCV Mat オブジェクトをロードするための FileStorage のより効率的な代替手段ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-05 11:21:17589ブラウズ

Is Binary File I/O a More Efficient Alternative to FileStorage for Loading Large OpenCV Mat Objects?

OpenCV を使用した大きな Mat オブジェクトの効率的なロード

大きな Mat オブジェクトをメモリにロードすることは、画像処理アプリケーションでは一般的な操作です。 OpenCV の FileStorage メソッドは簡単なオプションですが、より効率的な代替手段はありますか?

バイナリ形式による高速ロード

効率向上の鍵は保存と保存にあります。 Mat をバイナリ形式でロードします。 OpenCV は、特にこの目的のために matwrite 関数と matread 関数を提供します。

大幅なパフォーマンスの向上

さまざまなサイズの Mat オブジェクトに対して実行されたテストでは、バイナリ読み込みを使用した場合に劇的なパフォーマンスの向上が示されています。 FileStorage を介して。小さい画像 (250K 行、192 列) の場合、バイナリ読み込みにより、読み込み時間が 5.5 秒からわずか 50 ミリ秒に短縮されました。同様に、より大きな画像 (100 万行、192 列) の場合、バイナリのロードには 197 ミリ秒しかかかりませんでしたが、FileStorage はメモリ制限によりロードに失敗しました。

実装と使用法

関数 matwrite はファイル名と Mat オブジェクトを入力として受け取りますが、matread はファイル名のみを受け取ります。これらの関数は、必要なヘッダーとバイナリ形式でのデータの保存/取得を処理します。

サンプル コード

これは、matwrite と matread を示すサンプル コードです。関数:

void matwrite(const string& filename, const Mat& mat)
{
    // Header information
    ofstream fs(filename, fstream::binary);
    fs.write((char*)&mat.rows, sizeof(int));
    fs.write((char*)&mat.cols, sizeof(int));
    fs.write((char*)&mat.type(), sizeof(int));
    fs.write((char*)&mat.channels(), sizeof(int));

    // Data
    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);

    // Header information
    int rows, cols, type, channels;
    fs.read((char*)&amp;rows, sizeof(int));
    fs.read((char*)&amp;cols, sizeof(int));
    fs.read((char*)&amp;type, sizeof(int));
    fs.read((char*)&amp;channels, sizeof(int));

    // Data
    Mat mat(rows, cols, type);
    fs.read((char*)mat.data, CV_ELEM_SIZE(type) * rows * cols);
    return mat;
}

結論

大きな Mat オブジェクトをメモリにロードするためにバイナリ形式を使用すると、FileStorage メソッドと比較してパフォーマンスが大幅に向上します。 matwrite 関数と matread 関数は、このアプローチを実装するための便利で効率的な方法を提供します。この手法を実装すると、読み込み時間を短縮し、OpenCV ベースのアプリケーションのパフォーマンスを向上させることができます。

以上がバイナリ ファイル I/O は、大きな OpenCV Mat オブジェクトをロードするための FileStorage のより効率的な代替手段ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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