我很难理解OpenCV
中的Mat
类型是如何工作的,以及它在以下情况下的行为方式。不幸的是,我为这个例子考虑的文档在这里对我没有太大帮助。。。
这是我的程序:
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 200200 200 200 200200 200 200 200200 200 200 200200 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
条目?
,你做错了两件事
1) 如果你的垫子是CV_16S,你必须以m.at<short>(r,c);
的身份访问它(换句话说,at<type>()
必须与Mat的类型完全匹配。)
2) 这是opencv中的行/列世界,所以如果我遍历行上的列和j,那必须是:m.at<short>(j,i);