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

标签: c++ visual-studio-2010 opencv vector mat


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-19
      • 2022-01-02
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      相关资源
      最近更新 更多