Bagaimana dengan Cekap Menukar Mat OpenCV kepada Array atau Vektor?

Susan Sarandon
Lepaskan: 2024-10-27 03:32:30
asal
232 orang telah melayarinya

How to Efficiently Convert OpenCV Mat to an Array or Vector?

Tukar Mat kepada Array atau Vector dalam OpenCV

Dalam operasi matriks OpenCV, kadangkala terdapat keperluan untuk menukar Mat kepada Array atau Vector . Artikel ini menyediakan panduan komprehensif untuk mencapai penukaran sedemikian, menggunakan fungsi teguh OpenCV.

Penukaran Terus kepada Array

Jika tikar objek Mat mempunyai memori berterusan, datanya boleh dapat diambil secara terus sebagai tatasusunan 1D:

<code class="cpp">std::vector<uchar> array(mat.rows * mat.cols * mat.channels());
if (mat.isContinuous())
    array = mat.data;</code>
Salin selepas log masuk

Penukaran kepada Tatasusunan Berasaskan Baris

Dalam kes di mana memori tidak berterusan, data boleh diperolehi baris mengikut baris, menghasilkan tatasusunan 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

Penukaran Vektor Alternatif

Menggunakan std::vector menawarkan pendekatan alternatif untuk menukar Mat kepada tatasusunan:

<code class="cpp">std::vector<uchar> array;
if (mat.isContinuous()) {
    // array.assign(mat.datastart, mat.dataend); // May cause issues for sub-matrices
    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

Menukar kepada Vektor Jenis Lain

Untuk Mat OpenCV dengan jenis data lain, seperti CV_32F, proses penukaran adalah serupa:

<code class="cpp">std::vector<float> array;
if (mat.isContinuous()) {
    // array.assign((float*)mat.datastart, (float*)mat.dataend); // May cause issues for sub-matrices
    array.assign((float*)mat.data, (float*)mat.data + mat.total() * mat.channels());
} else {
    for (int i = 0; i < mat.rows; ++i) {
        array.insert(array.end(), mat.ptr<float>(i), mat.ptr<float>(i) + mat.cols * mat.channels());
    }
}</code>
Salin selepas log masuk

Memahami Kesinambungan Data Mat

Adalah penting untuk memahami kesinambungan data Mat untuk melaksanakan penukaran dengan berkesan. Perkara utama yang perlu diberi perhatian ialah:

  • Tikar yang dicipta melalui imread(), klon(), atau pembina adalah berterusan secara semula jadi.
  • Ketakselanjaran data hanya berlaku apabila Mat meminjam data daripada Mat sedia ada (kecuali untuk senario tertentu yang melibatkan lebar asal penuh).

Atas ialah kandungan terperinci Bagaimana dengan Cekap Menukar Mat OpenCV kepada Array atau Vektor?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!