为什么OpenCV Mat对象在嵌套for循环中分配后不包含期望值?

时间:2015-03-03 14:43:17

标签: c++ opencv mat

我无法理解MatOpenCV类型的工作原理,以及它在下列情况下的行为方式。不幸的是,我在这个例子中考虑的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条目的原因是什么?

1 个答案:

答案 0 :(得分:2)

你在那里做了两件事,

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

2)它在opencv中的行/ col世界,所以如果我越过cols和j越过行,那必须是:m.at<short>(j,i);