Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menukar Objek Mat kepada Array atau Vektor dalam OpenCV?

Bagaimana untuk Menukar Objek Mat kepada Array atau Vektor dalam OpenCV?

Barbara Streisand
Barbara Streisandasal
2024-10-26 13:48:02193semak imbas

How to Convert a Mat Object to an Array or Vector in 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!

Kenyataan:
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