【发布时间】: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);初始化它实际上使输出符合预期!