Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Memuatkan Objek Mat OpenCV Besar dengan Cekap ke dalam Memori?

Bagaimanakah Saya Boleh Memuatkan Objek Mat OpenCV Besar dengan Cekap ke dalam Memori?

Susan Sarandon
Lepaskan: 2024-12-05 16:09:16
asal
626 orang telah melayarinya

How Can I Efficiently Load Large OpenCV Mat Objects into Memory?

Meningkatkan Prestasi: Cekap Memuatkan Objek Mat Besar menggunakan Fail Binari

Memuatkan objek Mat besar-besaran ke dalam memori adalah penting untuk pelbagai aplikasi OpenCV. Walaupun kaedah FileStorage ialah pendekatan biasa, ia mungkin bukan pilihan yang paling cekap untuk mengendalikan set data yang besar. Berikut ialah teknik alternatif yang menjanjikan peningkatan prestasi yang ketara.

Format Perduaan: Kunci Kepantasan dan Kecekapan

Rahsianya terletak pada menyimpan dan memuatkan imej dalam format binari. Menggunakan fungsi matwrite dan matread, kami boleh mencapai peningkatan kelajuan yang luar biasa berbanding kaedah FileStorage.

Hasil Penandaarasan: Dunia Perbezaan

Dalam ujian yang dijalankan dengan 250K baris x 192 imej lajur (CV_8UC1), perbezaan prestasi sangat ketara:

  • Storan Fail: 5523.45 ms
  • Format Perduaan: 50.0879 ms

Untuk imej yang lebih besar 1M baris x 192 lajur), kaedah FileStorage gagal kerana ralat kehabisan ingatan, manakala mod binari mengendalikannya dengan mudah hanya dalam 197.381 ms.

Pelaksanaan Kod: Dipermudahkan dan Berkesan

Berikut ialah coretan kod dengan matwrite dan Fungsi matread, bersama-sama dengan ujian untuk menggambarkan keuntungan prestasi mereka:

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;
}
Salin selepas log masuk

Kesimpulan: Membuka Kunci Tahap Prestasi Baharu

Dengan memeluk format fail binari, anda mendapat kelebihan prestasi yang ketara apabila memuatkan objek Mat besar ke dalam memori. Teknik ini boleh mengurangkan masa pemuatan secara drastik, membolehkan aplikasi anda berfungsi dengan lebih cekap dengan set data yang besar.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memuatkan Objek Mat OpenCV Besar dengan Cekap ke dalam Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan