我无法理解Mat
中OpenCV
类型的工作原理,以及它在下列情况下的行为方式。不幸的是,我在这个例子中考虑的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
循环中生成的第一个输出给出了我期望的结果,即:
矩阵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行和每列的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,这与我预期的不同。有人可以向我解释这背后的逻辑吗?在我使用0
在矩阵中分配每个值之前,我错过了什么,导致200
条目的原因是什么?
答案 0 :(得分:2)
你在那里做了两件事,
1)如果您的Mat是CV_16S,则必须以m.at<short>(r,c);
的形式访问它
(换句话说,您at<type>()
必须完全匹配Mat的类型。)
2)它在opencv中的行/ col世界,所以如果我越过cols和j越过行,那必须是:m.at<short>(j,i);