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-29 08:21:30415semak imbas

How to Efficiently Convert OpenCV Mat to Array or Vector?

Menukar OpenCV Mat kepada Array/Vector

Masalah:
Untuk pemula dalam OpenCV, mencari fungsi yang sesuai untuk menukar Mat kepada Array boleh mencabar. Kaedah sedia ada seperti .ptr dan .at mungkin tidak menyediakan format data yang diingini.

Jawapan:

Untuk Mat berterusan (di mana semua data disimpan secara berturut-turut), data boleh diambil terus sebagai tatasusunan 1D:

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

Untuk Mat tidak berterusan, data perlu diekstrak baris demi 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>

Kemas kini:

Untuk meningkatkan kesederhanaan, menggunakan std::vector disyorkan:

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

Untuk jenis data selain CV_8UC1 (cth., CV_32F), gunakan data yang sesuai taip definisi vektor.

Kemas kini 2:

Mengenai kesinambungan data Mat:

  • Matriks yang dicipta oleh imread(), klon( ), atau pembina sentiasa berterusan.
  • Tikar Bukan berterusan hanya timbul apabila meminjam data daripada matriks sedia ada, kecuali apabila data yang dipinjam berterusan dalam matriks asal (cth., baris tunggal atau baris lebar 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