Maison > développement back-end > C++ > le corps du texte

Comment convertir un objet Mat en un tableau ou un vecteur dans OpenCV ?

Barbara Streisand
Libérer: 2024-10-26 13:48:02
original
192 Les gens l'ont consulté

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

Conversion de Mat en tableau dans OpenCV

OpenCV fournit diverses méthodes de conversion entre différentes structures de données. Dans cet article, nous nous concentrerons sur la conversion d'un objet Mat en un tableau ou un vecteur.

Conversion directe de Mat en tableau

Pour un Mat continu, où les données sont stockées de manière contiguë en mémoire, vous pouvez accéder directement à ses données sous forme de tableau 1D :

<code class="cpp">cv::Mat mat;
// ...
std::vector<uchar> array(mat.rows * mat.cols * mat.channels());
if (mat.isContinuous()) {
    array = mat.data;
}</code>
Copier après la connexion

Conversion en tableau 2D

Pour un Mat non continu , vous pouvez récupérer ses données ligne par ligne et les stocker dans un tableau 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>
Copier après la connexion

Conversion en vecteur

Si vous utilisez le vecteur de la bibliothèque standard C, vous peut utiliser l'approche suivante :

<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>
Copier après la connexion

Continuité des données du Mat

Il convient de noter que la continuité d'un Mat affecte l'efficacité de l'accès aux données. Les matrices créées par imread(), clone() ou un constructeur sont généralement continues. À l'inverse, les matrices créées à partir d'une ROI (région d'intérêt) d'un Mat plus grand peuvent ne pas être continues.

Cet extrait de code démontre les différences dans la continuité des données :

<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>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!