Bagaimana untuk Menukar Objek Mat kepada Array atau Vektor dalam OpenCV?

Barbara Streisand
Lepaskan: 2024-10-26 13:48:02
asal
192 orang telah melayarinya

How to Convert a Mat Object to an Array or Vector in OpenCV?

Menukar Mat kepada Array dalam OpenCV

OpenCV menyediakan pelbagai kaedah untuk menukar antara struktur data yang berbeza. Dalam artikel ini, kami akan menumpukan pada penukaran daripada objek Mat kepada tatasusunan atau vektor.

Penukaran Terus daripada Mat kepada Tatasusunan

Untuk Mat berterusan, di mana data disimpan bersebelahan dalam ingatan, anda boleh mengakses datanya secara terus sebagai tatasusunan 1D:

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

Penukaran kepada Tatasusunan 2D

Untuk Mat tidak berterusan , anda boleh mendapatkan semula baris datanya demi baris dan menyimpannya dalam tatasusunan 2D:

<code class="cpp">cv::Mat mat;
// ...
std::vector<std::vector<uchar>> array(mat.rows);
for (int i = 0; i < mat.rows; ++i) {
    array[i] = std::vector<uchar>(mat.cols * mat.channels());
    array[i] = mat.ptr<uchar>(i);
}</code>
Salin selepas log masuk

Penukaran kepada Vektor

Jika menggunakan vektor Perpustakaan Standard C, anda boleh menggunakan pendekatan berikut:

<code class="cpp">cv::Mat mat;
// ...
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

Perlu diperhatikan bahawa kesinambungan Mat mempengaruhi kecekapan akses data. Matriks yang dicipta oleh imread(), klon(), atau pembina biasanya berterusan. Sebaliknya, matriks yang dicipta daripada ROI (rantau kepentingan) bagi Mat yang lebih besar mungkin tidak berterusan.

Coretan kod ini menunjukkan perbezaan dalam kesinambungan data:

<code class="cpp">cv::Mat big_mat = cv::Mat::zeros(1000, 1000, CV_8UC3);
cv::Mat sub_mat = big_mat(cv::Rect(10, 10, 100, 100));

std::cout << "big_mat is continuous: " << big_mat.isContinuous() << std::endl; // true
std::cout << "sub_mat is continuous: " << sub_mat.isContinuous() << std::endl; // false</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menukar Objek Mat kepada Array atau Vektor dalam OpenCV?. 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!