首页 >后端开发 >C++ >如何高效地将OpenCV Mat转换为数组或向量?

如何高效地将OpenCV Mat转换为数组或向量?

Susan Sarandon
Susan Sarandon原创
2024-10-29 08:21:30374浏览

How to Efficiently Convert OpenCV Mat to Array or Vector?

将 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 数据连续性:

  • 由 imread()、clone( ),或构造函数始终是连续的。
  • 非连续 Mat 仅在从现有矩阵借用数据时出现,除非借用的数据在原始矩阵中是连续的(例如,单行或全角行)。

以上是如何高效地将OpenCV Mat转换为数组或向量?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn