Maison >développement back-end >C++ >Comment convertir un objet Mat en un tableau ou un vecteur dans OpenCV ?
Conversion de Mat en tableau dans OpenCV
OpenCV fournit diverses méthodes de conversion entre différentes structures de données. Dans cet article, nous nous concentrerons sur la conversion d'un objet Mat en un tableau ou un vecteur.
Conversion directe de Mat en tableau
Pour un Mat continu, où les données sont stockées de manière contiguë en mémoire, vous pouvez accéder directement à ses données sous forme de tableau 1D :
<code class="cpp">cv::Mat mat; // ... std::vector<uchar> array(mat.rows * mat.cols * mat.channels()); if (mat.isContinuous()) { array = mat.data; }</code>
Conversion en tableau 2D
Pour un Mat non continu , vous pouvez récupérer ses données ligne par ligne et les stocker dans un tableau 2D :
<code class="cpp">cv::Mat mat; // ... std::vector<std::vector<uchar>> array(mat.rows); for (int i = 0; i < mat.rows; ++i) { array[i] = std::vector<uchar>(mat.cols * mat.channels()); array[i] = mat.ptr<uchar>(i); }</code>
Conversion en vecteur
Si vous utilisez le vecteur de la bibliothèque standard C, vous peut utiliser l'approche suivante :
<code class="cpp">cv::Mat mat; // ... 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 du Mat
Il convient de noter que la continuité d'un Mat affecte l'efficacité de l'accès aux données. Les matrices créées par imread(), clone() ou un constructeur sont généralement continues. À l'inverse, les matrices créées à partir d'une ROI (région d'intérêt) d'un Mat plus grand peuvent ne pas être continues.
Cet extrait de code démontre les différences dans la continuité des données :
<code class="cpp">cv::Mat big_mat = cv::Mat::zeros(1000, 1000, CV_8UC3); cv::Mat sub_mat = big_mat(cv::Rect(10, 10, 100, 100)); std::cout << "big_mat is continuous: " << big_mat.isContinuous() << std::endl; // true std::cout << "sub_mat is continuous: " << sub_mat.isContinuous() << std::endl; // false</code>
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!