Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menukar Objek Mat kepada Array atau Vektor dalam OpenCV?
Menukar Mat kepada Array dalam OpenCV
OpenCV menyediakan pelbagai kaedah untuk menukar antara struktur data yang berbeza. Dalam artikel ini, kami akan menumpukan pada penukaran daripada objek Mat kepada tatasusunan atau vektor.
Penukaran Terus daripada Mat kepada Tatasusunan
Untuk Mat berterusan, di mana data disimpan bersebelahan dalam ingatan, anda boleh mengakses datanya secara terus sebagai tatasusunan 1D:
<code class="cpp">cv::Mat mat; // ... std::vector<uchar> array(mat.rows * mat.cols * mat.channels()); if (mat.isContinuous()) { array = mat.data; }</code>
Penukaran kepada Tatasusunan 2D
Untuk Mat tidak berterusan , anda boleh mendapatkan semula baris datanya demi baris dan menyimpannya dalam tatasusunan 2D:
<code class="cpp">cv::Mat mat; // ... std::vector<std::vector<uchar>> array(mat.rows); for (int i = 0; i < mat.rows; ++i) { array[i] = std::vector<uchar>(mat.cols * mat.channels()); array[i] = mat.ptr<uchar>(i); }</code>
Penukaran kepada Vektor
Jika menggunakan vektor Perpustakaan Standard C, anda boleh menggunakan pendekatan berikut:
<code class="cpp">cv::Mat mat; // ... 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
Perlu diperhatikan bahawa kesinambungan Mat mempengaruhi kecekapan akses data. Matriks yang dicipta oleh imread(), klon(), atau pembina biasanya berterusan. Sebaliknya, matriks yang dicipta daripada ROI (rantau kepentingan) bagi Mat yang lebih besar mungkin tidak berterusan.
Coretan kod ini menunjukkan perbezaan dalam kesinambungan data:
<code class="cpp">cv::Mat big_mat = cv::Mat::zeros(1000, 1000, CV_8UC3); cv::Mat sub_mat = big_mat(cv::Rect(10, 10, 100, 100)); std::cout << "big_mat is continuous: " << big_mat.isContinuous() << std::endl; // true std::cout << "sub_mat is continuous: " << sub_mat.isContinuous() << std::endl; // false</code>
Atas ialah kandungan terperinci Bagaimana untuk Menukar Objek Mat kepada Array atau Vektor dalam OpenCV?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!