Maison >développement back-end >C++ >Comment convertir efficacement un objet OpenCV Mat en un tableau ou un vecteur C ?
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 :
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!