为什么 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);
我无法理解 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);