为啥我在嵌套的 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<short>(r,c);
访问它
(换句话说,你 at<type>()
必须完全匹配 Mat 的类型。)
2) 它是 opencv 中的 row/col 世界,所以如果 i 越过 cols 和 j 越过行,那一定是:m.at<short>(j,i);
【讨论】:
令人讨厌的是,short
可以超过 16 位。我会尝试int16_t
。以上是关于为啥我在嵌套的 for 循环中分配 OpenCV Mat 对象后不包含预期值?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?