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

如何有效地将 OpenCV Mat 对象转换为 C 数组或向量?

Linda Hamilton
Linda Hamilton原创
2024-10-26 14:08:03784浏览

How do I efficiently convert an OpenCV Mat object to a C   array or vector?

在 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>

其中mat是Mat对象,array是转换后的数组,.rows,.cols , 和 .channels() 表示图像尺寸和通道数,.data 是指向图像数据的指针。

转换为向量

对于非连续的 Mats,需要逐行检索数据。下面是转换为 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 可以简化转换:

<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>

Mat 数据连续性

了解 Mat 数据连续性对于高效转换至关重要。以下是一些关键点:

  • 使用 imread()、clone() 或构造函数创建的 Mat 始终是连续的。
  • Mats 仅在借用数据时才会变得不连续来自现有的 Mat(借用单行或多行具有完整原始宽度的情况除外)。

例如,在以下代码片段中:

<code class="cpp">cv::Mat image = cv::imread("image.jpg"); // continuous Mat
cv::Mat sub_image = image(cv::Rect(100, 100, 100, 100)); // non-continuous Mat since it borrows data from `image`</code>

图像是连续的Mat 因为它是使用 imread() 创建的,而 sub_image 是不连续的,因为它引用了图像 Mat 的一部分。

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

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