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

Why does the OpenCV Mat object not contain the expected values after I assigned them in a nested for loop?

我无法理解 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 循环中生成的第一个输出给出了我期望的结果,即:

矩阵 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,这与我预期的不同。有人可以向我解释这背后的逻辑吗?我错过了什么,是什么导致了 0 条目,在我用 200 分配矩阵中的每个值之前?

你做错了两件事,

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

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