Rumah >pembangunan bahagian belakang >C++ >Bagaimana dengan Cekap Menukar Mat OpenCV kepada Array atau Vektor?

Bagaimana dengan Cekap Menukar Mat OpenCV kepada Array atau Vektor?

Susan Sarandon
Susan Sarandonasal
2024-10-27 03:32:30357semak imbas

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>

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>

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>

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>

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!

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