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

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

Susan Sarandon
Susan Sarandonoriginal
2024-10-29 08:21:30381parcourir

How to Efficiently Convert OpenCV Mat to Array or Vector?

Conversion d'OpenCV Mat en tableau/vecteur

Problème :
Pour les débutants en OpenCV, trouver des fonctions adaptées convertir Mat en Array peut être difficile. Les méthodes existantes telles que .ptr et .at peuvent ne pas fournir le format de données souhaité.

Réponse :

Pour les tapis continus (où toutes les données sont stockées consécutivement), les données peut ê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>

Pour les tapis non continus, les données doivent être extraites 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>

Mise à jour :

Pour plus de simplicité, l'utilisation de std::vector est recommandée :

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

Pour les types de données autres que CV_8UC1 (par exemple, CV_32F), utilisez les données appropriées tapez la définition du vecteur.

Mise à jour 2 :

Concernant la continuité des données Mat :

  • Matrices créées par imread(), clone( ), ou les constructeurs sont toujours continus.
  • Les tapis non continus n'apparaissent que lors de l'emprunt de données à des matrices existantes, sauf lorsque les données empruntées sont continues dans la matrice d'origine (par exemple, des lignes simples ou des lignes pleine largeur).

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