【问题标题】:Different values in accessing openCV Mat [duplicate]访问openCV Mat的不同值[重复]
【发布时间】:2021-12-23 18:59:27
【问题描述】:

我遇到了一个奇怪的问题。

我的垫子被声明为:

cv::Mat matr(src.rows, src.cols, CV_32FC1);

如果我使用cout<<matr 打印它,我会得到 0 到 255 范围内的所有数据,一切都很好。

如果我尝试使用此循环访问:

float* matrF= (float*)matr.data;

for (int r=0; r<matrF.rows; r++)
  {
    for (int c=0; c<matrF.cols; c++)
    {
      std::cout<<matrF[r*matr.cols+c]<<std::endl;
    }
  }

我得到许多值,例如:4.684e-42, 2.223e-22 ecc。

如果我使用

for (int r=0; r<matrF.rows; r++)
      {
        for (int c=0; c<matrF.cols; c++)
        {
          std::cout<<matr.data[r*matr.cols+c]<<std::endl;
        }
      }

它打印一些随机字符并且没​​有值。

我可以访问使用 cout&lt;&lt;matr 打印的元素吗? 我不想使用 openCV 中的函数来访问它们,我正在尝试遍历 matr.data...

我不能使用mat.at&lt;float&gt;.step1()。 谢谢。

---------解决方案

如果不是

for (int r=0; r<matrF.rows; r++)
  {
    for (int c=0; c<matrF.cols; c++)
    {
      std::cout<<matrF.data[r*matr.cols+c]<<std::endl;
    }
  }

我用

for (int r=0; r<matrF.rows; r++)
  {
    for (int c=0; c<matrF.cols; c++)
    {
      float val = matF.data[r*matr.cols+c];
      std::cout<<val<<std::endl;
    }
  }

问题消失了。

【问题讨论】:

  • 刚刚发现问题。有人可以解释一下吗?我编辑我的帖子。
  • Inszeadt of rmatr.cols 使用 rmatr.step 或 rowPrt(r) 如果你想让它对所有类型的矩阵都稳定(可以很容易地有一个填充在每一行的末尾)。 .at(row, col) 是另一种快速(在发布模式下)、漂亮且可读性好的方式。

标签: c++ opencv floating-point mat


【解决方案1】:

它很可能是不连续的。那么你就不能使用matr.data查看所有元素了。

请阅读本教程以了解如何操作:https://docs.opencv.org/4.x/db/da5/tutorial_how_to_scan_images.html

【讨论】:

  • 我想在不使用mat.at&lt;float&gt;等函数的情况下访问数据
  • @0abc0cba0 请看教程。它告诉你怎么做。例如逐行获取指针.
  • 链接不指向32F
  • @l000000l 想法是一样的。只需将p = I.ptr&lt;uchar&gt;(i); 更改为p = I.ptr&lt;float&gt;(i);。 stackoverflow 中的人应该对编程有基本的了解。
  • 我在帖子里说过,我不能用.ptr&lt;float&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
相关资源
最近更新 更多