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& filename) { ifstream fs(filename, fstream::binary); // Header information int rows, cols, type, channels; fs.read((char*)&rows, sizeof(int)); fs.read((char*)&cols, sizeof(int)); fs.read((char*)&type, sizeof(int)); fs.read((char*)&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 サイトの他の関連記事を参照してください。