将 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<unsigned char> 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)
如何在不复制数据的情况下将 cv::Mat 转换为 2d std::vector