OpenCV 中将 Mat 转换为数组或向量
在 OpenCV 矩阵运算中,偶尔需要将 Mat 转换为数组或向量。本文提供了利用 OpenCV 强大功能实现此类转换的全面指南。
直接转换为数组
如果 Mat 对象 mat 拥有连续内存,则其数据可以直接作为一维数组获取:
<code class="cpp">std::vector<uchar> array(mat.rows * mat.cols * mat.channels()); if (mat.isContinuous()) array = mat.data;</code>
转换为Row-Based Array
在内存不连续的情况下,可以获取row的数据按行,生成 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>
替代向量转换
使用 std::vector 提供了将 Mat 转换为数组的另一种方法:
<code class="cpp">std::vector<uchar> array; if (mat.isContinuous()) { // array.assign(mat.datastart, mat.dataend); // May cause issues for sub-matrices 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>
转换为其他类型的向量
对于其他数据类型的 OpenCV Mat,例如 CV_32F,转换过程类似:
<code class="cpp">std::vector<float> array; if (mat.isContinuous()) { // array.assign((float*)mat.datastart, (float*)mat.dataend); // May cause issues for sub-matrices array.assign((float*)mat.data, (float*)mat.data + mat.total() * mat.channels()); } else { for (int i = 0; i < mat.rows; ++i) { array.insert(array.end(), mat.ptr<float>(i), mat.ptr<float>(i) + mat.cols * mat.channels()); } }</code>
理解 Mat 数据连续性
理解 Mat 数据连续性对于有效执行转换至关重要。需要注意的要点是:
以上是如何高效地将 OpenCV Mat 转换为数组或向量?的详细内容。更多信息请关注PHP中文网其他相关文章!