提升效能:使用二進位檔案高效載入大型Mat 物件
將大量Mat 物件載入到記憶體中對於各種OpenCV 應用程式至關重要。雖然 FileStorage 方法是一種常見方法,但它可能不是處理大型資料集最有效的選項。這是一種有望顯著提高性能的替代技術。
二進位格式:速度和效率的關鍵
秘訣在於在 中儲存和載入影像二進位格式。與 FileStorage 方法相比,使用 matwrite 和 matread 函數,我們可以得到顯著的速度提升。
基準測試結果:天壤之別
使用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中文網其他相關文章!