将 Mat 转换为 <vector<vector>> C++
Posted
技术标签:
【中文标题】将 Mat 转换为 <vector<vector>> C++【英文标题】:Convert Mat to <vector<vector>> C++ 【发布时间】:2013-11-19 11:33:47 【问题描述】:如何在 C++ 中将 Mat 转换为 2d 向量(向量的向量)? 我试过了,但 Mat.at 函数出错了。
vector<vector<double>> dctm(300, vector<double>(300,0));
for (int i = 0; i < 300; i++)
for (int j = 0; j < 300; j++)
dctm[i][j] = img.at<double>(i, j);
【问题讨论】:
XY.exe 中 0x7690c41f 处未处理的异常:Microsoft C++ 异常:cv::Exception at memory location 0x012aecb8.. /mat.hpp:537: error: (-215) dims ::channels) > ((DataType<_tp>::depth ) & ((1 ,std::allocator您可以通过迭代值并逐个推送它们来填充向量,但通常这不是一种好的做法。更好的解决方案是使用 stl 提供给您的范围函数。这不仅适用于矢量,也适用于任何其他 stl 结构。
更清洁(从 stl 的角度来看)和更快的解决方案应该是这样的:
for(int i=0; i<300; i++)
Mat r = img.row(i);
dctm.push_back(vector<double>(r.begin<unsigned char>(), r.end<unsigned char>()));
【讨论】:
【参考方案2】:更快的方法是
vector<vector<double>> dctm(300, vector<double>(300,0));
for (int i = 0; i < 300; i++)
uchar *rowPtr = img.ptr<uchar>(i);
for (int j = 0; j < 300; j++)
dctm[i][j] = *rowPtr[j];
见How to scan images, lookup tables and time measurement with OpenCV
【讨论】:
以上是关于将 Mat 转换为 <vector<vector>> C++的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV2.4.2将vector<Point2f>转换为Mat,释放mat会报错