【问题标题】:How to create a Mat on OpenCV for making an histogram如何在 OpenCV 上创建一个 Mat 来制作直方图
【发布时间】:2023-04-02 08:24:01
【问题描述】:

我正在制作一种存储在 OpenCV 矩阵中的直方图。

所以,如果我匹配一个结果,我会在某个索引上 +1。

我的垫子是:

Mat countFramesMatrix = Mat::zeros(9,9,CV_8U);

当我尝试访问 sum +1 到已设置的索引(从 0 开始)时,我会这样做:

int valueMatrixFrames = countFramesMatrix.at<int>(sliceMatch.j, sliceMatch.i);
valueMatrixFrames++;
countFramesMatrix.at<unsigned char>(sliceMatch.j, sliceMatch.i) = (unsigned char)valueMatrixFrames;

我尝试了其他方式,例如将 unsigned char 更改为 int 之前遇到的其他问题,但没有任何反应。

我的结果是:

  1. 或者所有矩阵都为零。
  2. 或者我得到类似的东西:

    [2.3693558e-38, 0, 0, 0, 0, 0, 0, 0, 0; 2.3693558e-38, 0, 0, 0, 0, 0, 0, 0, 0; 0, 0, 0, 0, 0, 0, 0, 0, 0; 0, 0, 0, 0, 0, 0, 0, 0, 0; 0, 0, 0, 0, 0, 0, 0, 0, 0; 0, 0, 0, 0, 0, 0, 0, 0, 0; 0, 0, 0, 0, 0, 0, 0, 0, 0; 0, 0, 0, 0, 0, 0, 0, 0, 0; 0, 0, 0, 0, 0, 0, 0, 0, 0]

而且我从不将数据存储在 (0,0) 或 (0,1) 或 (1,0) 或 (1,1),:(

你有什么建议?谢谢。

【问题讨论】:

  • 如何声明 countFramesMatrix ?您访问此矩阵有时会告诉编译器这是一个 int 矩阵,有时会告诉编译器这是一个 char 矩阵。从技术上讲,这不是禁止这样做的,但我怀疑这是你想要做的。

标签: c++ opencv image-processing mat


【解决方案1】:

你犯了一个非常简单的错误,

valueMatrixFrames++;

将增加valueMatrixFrames 的值,而不是矩阵位置的值。

正确的方式

比方说,如果你想在 (1,1) 处递增,你应该使用,

countFramesMatrix.at<uchar>(1,1)++;

输出

 [0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 1, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0]

再次运行上述命令会将 (1, 1) 处的值增加到 2。

 [0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 2, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0]

那么,你的直方图就准备好了!!

【讨论】:

  • 是的,我在做valueMatrixFrames++,但后来我把它分配给我的矩阵,所以逻辑是正确的。我缺少的是uchar 的东西。非常感谢;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2013-01-01
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多