パフォーマンスの向上: バイナリ ファイルを使用した大規模な Mat オブジェクトの効率的なロード
大規模な Mat オブジェクトをメモリにロードすることは、さまざまな OpenCV アプリケーションにとって重要です。 FileStorage メソッドは一般的なアプローチですが、大規模なデータ セットを処理する場合は最も効率的なオプションではない可能性があります。ここでは、顕著なパフォーマンス向上を約束する代替テクニックを紹介します。
バイナリ形式: 速度と効率の鍵
その秘密は、 での画像の保存と読み込みにあります。バイナリ形式。 matwrite 関数と matread 関数を使用すると、FileStorage メソッドと比較して顕著な速度向上を達成できます。
ベンチマーク結果: 大きな違い
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 中国語 Web サイトの他の関連記事を参照してください。