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