首页 > 后端开发 > C++ > 正文

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

Susan Sarandon
发布: 2024-10-27 03:32:30
原创
232 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!