将 OpenCV Mat 转换为数组/向量
问题:
对于 OpenCV 初学者,寻找合适的函数将 Mat 转换为 Array 可能具有挑战性。 .ptr 和 .at 等现有方法可能无法提供所需的数据格式。
答案:
对于连续 Mat(所有数据连续存储),数据可以直接获取为一维数组:
<code class="cpp">std::vector<uchar> array(mat.rows * mat.cols * mat.channels()); if (mat.isContinuous()) array = mat.data;</code>
对于非连续的 Mats,需要逐行提取数据,得到一个二维数组:
<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:
<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>
对于 CV_8UC1 以外的数据类型(例如 CV_32F),请使用适当的数据输入向量定义。
更新 2:
关于 Mat 数据连续性:
以上是如何高效地将OpenCV Mat转换为数组或向量?的详细内容。更多信息请关注PHP中文网其他相关文章!