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

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

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 14:08:03861parcourir

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>

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>

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>

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>

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!

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