Maison  >  Article  >  développement back-end  >  Comment convertir efficacement un tapis OpenCV en un tableau ou un vecteur ?

Comment convertir efficacement un tapis OpenCV en un tableau ou un vecteur ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-27 03:32:30233parcourir

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

Convertir Mat en tableau ou vecteur dans OpenCV

Dans les opérations matricielles OpenCV, il est parfois nécessaire de convertir Mat en tableau ou en vecteur . Cet article fournit un guide complet pour réaliser de telles conversions, en utilisant la fonctionnalité robuste d'OpenCV.

Conversion directe en tableau

Si l'objet Mat possède une mémoire continue, ses données peuvent être directement récupéré sous forme de tableau 1D :

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

Conversion en tableau basé sur des lignes

Dans les cas où la mémoire n'est pas continue, les données peuvent être obtenues en ligne par ligne, ce qui donne un tableau 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>

Conversion vectorielle alternative

L'utilisation de std::vector offre une approche alternative pour convertir Mat en tableau :

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

Conversion en vecteurs d'autres types

Pour les tapis OpenCV avec d'autres types de données, tels que CV_32F, le processus de conversion est similaire :

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

Comprendre la continuité des données Mat

Il est crucial de comprendre la continuité des données Mat pour effectuer efficacement des conversions. Les points clés à noter sont :

  • Les tapis créés via imread(), clone() ou un constructeur sont intrinsèquement continus.
  • Les discontinuités de données ne se produisent que lorsqu'un tapis emprunte des données à un Tapis existant (sauf pour certains scénarios impliquant toute la largeur d'origine).

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!

Déclaration:
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