首頁 >後端開發 >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 方法是一種常見方法,但它可能不是處理大型資料集最有效的選項。這是一種有望顯著提高性能的替代技術。

二進位格式:速度和效率的關鍵

秘訣在於在 中儲存和載入影像二進位格式。與 FileStorage 方法相比,使用 matwritematread 函數,我們可以得到顯著的速度提升。

基準測試結果:天壤之別

使用250K 行x 192 列影像進行的測試(CV_8UC1),效能差異是驚人的:

  • 檔案儲存:5523.45 ms
  • 二進位格式:50.0879 ms

對於較大的影像(1M 行) x 192 欄位),FileStorage 方法因下列原因失敗記憶體不足錯誤,而二進位模式只需197.381 毫秒即可輕鬆處理。

程式碼實作:簡化且有效

這裡是有 matwritematread函數,以及說明其功能的測試性能提升:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn