Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh menukar objek OpenCV Mat dengan cekap kepada tatasusunan atau vektor C?
Tukar Mat kepada Array/Vektor dalam OpenCV
Dalam OpenCV, mengakses dan memanipulasi data imej adalah penting untuk pelbagai tugas pemprosesan imej. Satu keperluan biasa ialah penukaran objek Mat, yang mewakili imej atau matriks, kepada tatasusunan atau vektor.
Penukaran kepada Tatasusunan
Jika ingatan objek Mat adalah berterusan, bermakna semua datanya disimpan secara berturut-turut, anda boleh terus mendapatkan tatasusunan 1D menggunakan kod berikut:
<code class="cpp">std::vector<uchar> array(mat.rows * mat.cols * mat.channels()); if (mat.isContinuous()) array = mat.data;</code>
di mana mat ialah objek Mat, tatasusunan ialah tatasusunan yang ditukar, .rows, .cols , dan .channels() mewakili dimensi imej dan bilangan saluran, dan .data ialah penunjuk kepada data imej.
Penukaran kepada Vektor
Untuk bukan- Mat berterusan, data perlu diambil baris demi baris. Berikut ialah contoh untuk menukar kepada tatasusunan/vektor 2D:
<code class="cpp">uchar **array = new uchar*[mat.rows]; for (int i = 0; i < mat.rows; ++i) array[i] = new uchar[mat.cols * mat.channels()]; for (int i = 0; i < mat.rows; ++i) array[i] = mat.ptr<uchar>(i);</code>
Walau bagaimanapun, menggunakan std::vector boleh memudahkan penukaran:
<code class="cpp">std::vector<uchar> array; if (mat.isContinuous()) { array.assign(mat.data, mat.data + mat.total() * mat.channels()); } else { for (int i = 0; i < mat.rows; ++i) { array.insert(array.end(), mat.ptr<uchar>(i), mat.ptr<uchar>(i) + mat.cols * mat.channels()); } }</code>
Kesinambungan Data Mat
Memahami kesinambungan data Mat adalah penting untuk penukaran yang cekap. Berikut ialah beberapa perkara penting:
Sebagai contoh, dalam coretan kod berikut:
<code class="cpp">cv::Mat image = cv::imread("image.jpg"); // continuous Mat cv::Mat sub_image = image(cv::Rect(100, 100, 100, 100)); // non-continuous Mat since it borrows data from `image`</code>
imej ialah berterusan Mat kerana ia dicipta menggunakan imread(), manakala sub_image tidak berterusan kerana ia merujuk sebahagian daripada imej Mat.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menukar objek OpenCV Mat dengan cekap kepada tatasusunan atau vektor C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!