Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Memuatkan Objek Mat OpenCV Besar dengan Cekap ke dalam Memori?
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:
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& 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; }
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!