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

如何在 OpenCV 中将 Mat 对象转换为数组或向量?

Barbara Streisand
发布: 2024-10-26 13:48:02
原创
192 人浏览过

How to Convert a Mat Object to an Array or Vector in OpenCV?

在 OpenCV 中将 Mat 转换为 Array

OpenCV 提供了多种在不同数据结构之间进行转换的方法。在本文中,我们将重点讨论从 Mat 对象到数组或向量的转换。

从 Mat 到数组的直接转换

对于连续 Mat,其中数据连续存储在内存中,您可以直接将其数据作为一维数组访问:

<code class="cpp">cv::Mat mat;
// ...
std::vector<uchar> array(mat.rows * mat.cols * mat.channels());
if (mat.isContinuous()) {
    array = mat.data;
}</code>
登录后复制

转换为二维数组

对于非连续 Mat ,您可以逐行检索其数据并将其存储在 2D 数组中:

<code class="cpp">cv::Mat mat;
// ...
std::vector<std::vector<uchar>> array(mat.rows);
for (int i = 0; i < mat.rows; ++i) {
    array[i] = std::vector<uchar>(mat.cols * mat.channels());
    array[i] = mat.ptr<uchar>(i);
}</code>
登录后复制

转换为向量

如果使用 C 标准库的向量,您可以采用以下方法:

<code class="cpp">cv::Mat mat;
// ...
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>
登录后复制

Mat 数据连续性

值得注意的是,Mat 的连续性会影响数据访问的效率。由 imread()、clone() 或构造函数创建的矩阵通常是连续的。相反,从较大 Mat 的 ROI(感兴趣区域)创建的矩阵可能不连续。

此代码片段演示了数据连续性方面的差异:

<code class="cpp">cv::Mat big_mat = cv::Mat::zeros(1000, 1000, CV_8UC3);
cv::Mat sub_mat = big_mat(cv::Rect(10, 10, 100, 100));

std::cout << "big_mat is continuous: " << big_mat.isContinuous() << std::endl; // true
std::cout << "sub_mat is continuous: " << sub_mat.isContinuous() << std::endl; // false</code>
登录后复制

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

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