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

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

Susan Sarandon
Susan Sarandon原创
2024-10-27 03:32:30233浏览

How to Efficiently Convert OpenCV Mat to an Array or Vector?

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 数据连续性对于有效执行转换至关重要。需要注意的要点是:

  • 通过 imread()、clone() 或构造函数创建的 Mat 本质上是连续的。
  • 仅当 Mat 借用数据时才会出现数据不连续性。现有的 Mat(除了某些涉及完整原始宽度的场景)。

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

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