将 Cv::Mat 的数据存储在 std::vector 中

Posted

技术标签:

【中文标题】将 Cv::Mat 的数据存储在 std::vector 中【英文标题】:Storing a Cv::Mat's data in a std::vector 【发布时间】:2012-10-18 03:10:11 【问题描述】:

我想将数据从 cv::Mat 复制到 std::vector。我显然可以遍历整个 Mat 并一个一个地复制每个值,但我希望使用 copyTo、克隆或某种指针操作可能有一种更简单的方法。

有人对这个问题有任何见解吗?

谢谢

【问题讨论】:

在 OpenCV 中是一个从 std::vector 到 cv::Mat 的自动转换器。也可能有相反的转换器。检查 InputArray/OutupArray 属性。您可以将 mat 转换为 InputArray,然后使用 getVector() 或类似的东西。 【参考方案1】:

假设您的 Mat 是 CV_8UC1,您可以执行以下操作。

cv::Mat mat(nrows,ncols,CV_8UC1);
...
std::vector<unsigned char> vec;
vec.assign(mat.data,mat.data+nrows*ncols);

对于不同像素类型的多通道图像,我想你可以很容易地概括上面的代码。

【讨论】:

你也可以直接使用带有范围参数std::vector&lt;unsigned char&gt; vec(mat.data, mat.data+nrows*ncols)的向量构造函数【参考方案2】:

这对我自己有用。我有大小为 Nx1 的 Mat matVec2f,类型为 Vec2f,以及大小为 N 的向量。以下代码将 Mat 的数据复制到向量中。我相信这对于 Vec2f 以外的数据类型应该同样适用。

int N = 10;
vector<Point2f> vec(N);
matVec2f.copyTo(Mat(vec, false));

【讨论】:

以上是关于将 Cv::Mat 的数据存储在 std::vector 中的主要内容,如果未能解决你的问题,请参考以下文章

Opencv 在 cv::Mat 中存储 Yuyv (YCrCb)

open cv mat怎样将数据类型转化为double

OpenCV Mat 数据成员访问

如何在不复制数据的情况下将 cv::Mat 转换为 2d std::vector

OpenCV 使用 stride 从数组生成 cv::Mat

无法将值分配给函数内部的 cv::Mat