Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh menukar objek OpenCV Mat dengan cekap kepada tatasusunan atau vektor C?

Bagaimanakah saya boleh menukar objek OpenCV Mat dengan cekap kepada tatasusunan atau vektor C?

Linda Hamilton
Linda Hamiltonasal
2024-10-26 14:08:03859semak imbas

How do I efficiently convert an OpenCV Mat object to a C   array or vector?

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:

  • Tikar yang dibuat menggunakan imread(), klon(), atau pembina sentiasa berterusan.
  • Tikar hanya akan menjadi tidak berterusan apabila mereka meminjam data daripada Mat sedia ada (kecuali apabila meminjam baris tunggal atau berbilang baris dengan lebar asal penuh).

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!

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