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
Lepaskan: 2024-10-26 14:08:03
asal
856 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan