将 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 >跨度> 看看这里:***.com/questions/14303073/…(考虑使用 Vec3f 而不是 double...) 你的 Mat 的实际 type() 是什么?我敢打赌它不是双重的 它是无符号字符,但我想将其转换为双倍 【参考方案1】:

您可以通过迭代值并逐个推送它们来填充向量,但通常这不是一种好的做法。更好的解决方案是使用 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++的主要内容,如果未能解决你的问题,请参考以下文章

将 cv::Mat 转换为 vector<int>

将vector<Mat>转换为矢量文件Opencv

OpenCV2.4.2将vector<Point2f>转换为Mat,释放mat会报错

将 vector<Point3d> 转换为大小为 (n x 3) 的 Mat,反之亦然

如何将矢量<...> 转换为 cv::Mat?

vector类转换Mat类