Home >Backend Development >C++ >How to Convert a Mat Object to an Array or Vector in OpenCV?
Converting Mat to Array in OpenCV
OpenCV provides various methods for converting between different data structures. In this article, we will focus on the conversion from a Mat object to an array or vector.
Direct Conversion from Mat to Array
For a continuous Mat, where the data is stored contiguously in memory, you can directly access its data as a 1D array:
<code class="cpp">cv::Mat mat; // ... std::vector<uchar> array(mat.rows * mat.cols * mat.channels()); if (mat.isContinuous()) { array = mat.data; }</code>
Conversion to 2D Array
For a non-continuous Mat, you can retrieve its data row by row and store it in a 2D array:
<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 to Vector
If using the C Standard Library's vector, you can employ the following approach:
<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>
Mat Data Continuity
It's worth noting that the continuity of a Mat affects the efficiency of data access. Matrices created by imread(), clone(), or a constructor are typically continuous. Conversely, matrices created from an ROI (region of interest) of a larger Mat may not be continuous.
This code snippet demonstrates the differences in data continuity:
<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>
The above is the detailed content of How to Convert a Mat Object to an Array or Vector in OpenCV?. For more information, please follow other related articles on the PHP Chinese website!