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

Comment convertir efficacement un objet OpenCV Mat en un tableau ou un vecteur C ?

Linda Hamilton
Libérer: 2024-10-26 14:08:03
original
783 Les gens l'ont consulté

How do I efficiently convert an OpenCV Mat object to a C   array or vector?

Convertir un tapis en tableau/vecteur dans OpenCV

Dans OpenCV, l'accès et la manipulation des données d'image sont cruciales pour diverses tâches de traitement d'image. Une exigence courante est la conversion de l'objet Mat, qui représente une image ou une matrice, en un tableau ou un vecteur.

Conversion en tableau

Si la mémoire de l'objet Mat est continu, c'est-à-dire que toutes ses données sont stockées consécutivement, vous pouvez directement obtenir un tableau 1D en utilisant le code suivant :

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

où mat est l'objet Mat, array est le tableau converti, .rows, .cols , et .channels() représentent les dimensions de l'image et le nombre de canaux, et .data est un pointeur vers les données de l'image.

Conversion en vecteur

Pour les non- Tapis continus, les données doivent être récupérées ligne par ligne. Voici un exemple de conversion en tableau/vecteur 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>
Copier après la connexion

Cependant, l'utilisation d'un std::vecteur peut simplifier la conversion :

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

Continuité des données Mat

Comprendre la continuité des données Mat est essentiel pour une conversion efficace. Voici quelques points clés :

  • Les tapis créés à l'aide de imread(), clone() ou d'un constructeur sont toujours continus.
  • Les tapis ne deviendront non continus que lorsqu'ils emprunteront des données à partir d'un Mat existant (sauf lors de l'emprunt de lignes simples ou de plusieurs lignes avec toute la largeur d'origine).

Par exemple, dans l'extrait de code suivant :

<code class="cpp">cv::Mat image = cv::imread("image.jpg"); // continuous Mat
cv::Mat sub_image = image(cv::Rect(100, 100, 100, 100)); // non-continuous Mat since it borrows data from `image`</code>
Copier après la connexion

l'image est une image continue Mat car il a été créé à l'aide de imread(), tandis que sub_image est non continue car elle fait référence à une partie de l'image Mat.

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!