【问题标题】:OpenCV Mat::zeros not filled with 0OpenCV Mat::zeros 未填充 0
【发布时间】:2015-07-25 07:10:10
【问题描述】:

我有这个代码:

Mat Marker = Mat::zeros(MarkerSize, MarkerSize, CV_8UC1);

cout << "Marker:" << endl;
for (int row=0; row<MarkerSize; row++)
{
for (int col=0; col<MarkerSize; col++)
cout << Marker.at<int>(row, col)<<", ";

cout << endl;
}

其中MarkerSize=6CV_8UC1 最好是不可更改的(用于解决方案)。

但是我得到了这个输出:

Marker:
0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 65536, -1664876544, 
0, 0, 0, 1, 1141152964, 289879, 
0, 65536, -1664876544, 1817658372, 1531445252, 2147447774,

这是怎么回事,我该如何解决?

【问题讨论】:

  • Marker.at&lt;int&gt;(row, col) //
  • 换句话说,您的 Mat 初始化一切正常,您只是在检查结果时访问错误。 (顺便说一句,尽量避免编写每像素循环,而是使用cout &lt;&lt; Marker &lt;&lt; endl;
  • Marker.at&lt;int&gt;(row, col) 不起作用,输出为 Marker: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 。这虽然cout &lt;&lt; Marker &lt;&lt; endl; 有效并且输出是一个零矩阵。现在的问题是Marker.at&lt;???&gt;(row, col) 的类型是什么?
  • 再一次,opencv 的人在这里已经有了一个解决方案,那就是:一次打印出整个 Mat。 (cout
  • 再次,使用 opencv,-如果您尝试编写自己的每个像素的东西,-很有可能,您错过了一些高阶函数,没有错误和更快。

标签: c++ opencv unsigned-integer opencv-mat


【解决方案1】:

您的Mat 对象使用CV_8UC1 实例化,即包含MarkerSize*MarkerSize 8 位无符号元素。但是你迭代它,就好像它容器ints,在迭代中超出了界限。例如,通过使用

访问元素
Marker.at<uint8_t>(row, col)

请注意,要打印它,您可能必须转换为不同的整数类型,因为uint8_t 可以被std::cout 解释为char。例如

cout << static_cast<int>(Marker.at<uint8_t>(row, col)) <<", ";

【讨论】:

  • Marker.at&lt;uint8_t&gt;(row, col) 的输出:Marker: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 。对于dynamic_cast&lt;int&gt;(Marker_thresh.at&lt;uint8_t&gt;(row, col)),错误消息是'int' is not a reference or pointer...
  • cout &lt;&lt; static_cast&lt;int&gt;(Marker.at&lt;uint8_t&gt;(row, col)) &lt;&lt;", "; 也可以,谢谢!当我想更改Marker 中的某个值时,我必须使用什么类型? Marker.at&lt;uchar&gt;(row,col)=255;? uchar 是正确的类型吗?
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 2020-06-25
相关资源
最近更新 更多