为啥我在嵌套的 for 循环中分配 OpenCV Mat 对象后不包含预期值?

Posted

技术标签:

【中文标题】为啥我在嵌套的 for 循环中分配 OpenCV Mat 对象后不包含预期值?【英文标题】:Why does the OpenCV Mat object not contain the expected values after I assigned them in a nested for loop?为什么我在嵌套的 for 循环中分配 OpenCV Mat 对象后不包含预期值? 【发布时间】:2015-03-03 14:43:16 【问题描述】:

我无法理解OpenCV 中的Mat 类型是如何工作的,以及为什么它在以下情况下的行为方式如此。不幸的是,我为此示例考虑的docs 在这里对我没有多大帮助...

这是我的程序:

Mat matrix (5, 5, CV_16S);
matrix.setTo(0);

printf("matrix %d, %d: \n", matrix.cols, matrix.rows);
for( size_t i = 0; i < matrix.cols; i++ ) 
    for( size_t j = 0; j < matrix.rows; j++ ) 
        matrix.at<int>(i,j) = 200;
        printf( " %d ", matrix.at<int>(i,j));
    
    printf("\n");

cout << "matrix: " << matrix << endl;

在嵌套的for-loop 中生成的第一个输出给出了我期望的结果,即:

矩阵 5、5: 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200

这是因为我创建了一个有 5 行和 5 列的 Mat 对象,并在遍历它们时为每个条目分配了值 200。

但是,我使用cout 打印Mat 的最后一行给出了以下输出:

matrix: [200, 0, 200, 0, 200;
  200, 0, 200, 0, 200;
  200, 0, 200, 0, 200;
  200, 0, 200, 0, 200;
  200, 0, 200, 0, 200]

在这里,只有每隔一个条目分配一个值 200,这与我的预期不同。有人可以向我解释这背后的逻辑吗?在我用200 分配矩阵中的每个值之前,我错过了什么,导致0 条目的原因是什么?

【问题讨论】:

这可能与矩阵存储 16 位有符号数有关。用CV_32S 初始化它有什么不同吗? 哇哦,确实如此!我以前玩过这些类型,总是收到一些奇怪的结果,但我无法绘制重要的关系......所以,用Mat matrix (5, 5, CV_32S); 初始化它实际上使输出符合预期! 【参考方案1】:

你做错了两件事,

1) 如果您的 Mat 是 CV_16S,您必须以 m.at&lt;short&gt;(r,c); 访问它 (换句话说,你 at&lt;type&gt;() 必须完全匹配 Mat 的类型。)

2) 它是 opencv 中的 row/col 世界,所以如果 i 越过 cols 和 j 越过行,那一定是:m.at&lt;short&gt;(j,i);

【讨论】:

令人讨厌的是,short 可以超过 16 位。我会尝试int16_t

以上是关于为啥我在嵌套的 for 循环中分配 OpenCV Mat 对象后不包含预期值?的主要内容,如果未能解决你的问题,请参考以下文章

python中为啥我的for循环里嵌套的if只能循环一次?

为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?

为啥正常的 for 循环允许为结构字段分配值,而 for range 在 Golang 中不起作用? [复制]

matlab里面的for循环嵌套

c语言一个死循环中为啥执行完一个功能函数就退出了?

为啥它会忽略我在 for 循环中的继续? [关闭]