在 OpenCV 中将 Mat 转换为 Array
OpenCV 提供了多种在不同数据结构之间进行转换的方法。在本文中,我们将重点讨论从 Mat 对象到数组或向量的转换。
从 Mat 到数组的直接转换
对于连续 Mat,其中数据连续存储在内存中,您可以直接将其数据作为一维数组访问:
<code class="cpp">cv::Mat mat; // ... std::vector<uchar> array(mat.rows * mat.cols * mat.channels()); if (mat.isContinuous()) { array = mat.data; }</code>
转换为二维数组
对于非连续 Mat ,您可以逐行检索其数据并将其存储在 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>
转换为向量
如果使用 C 标准库的向量,您可以采用以下方法:
<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 数据连续性
值得注意的是,Mat 的连续性会影响数据访问的效率。由 imread()、clone() 或构造函数创建的矩阵通常是连续的。相反,从较大 Mat 的 ROI(感兴趣区域)创建的矩阵可能不连续。
此代码片段演示了数据连续性方面的差异:
<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>
以上是如何在 OpenCV 中将 Mat 对象转换为数组或向量?的详细内容。更多信息请关注PHP中文网其他相关文章!