Opencv 行方法有一个奇怪的行为
Opencv row method has a strange behavior
我正在使用 OpenCv Mat 访问和复制 (C++)。考虑以下示例:
cv::Mat values = cv::Mat::zeros(100, 1, CV_32FC1);
for (int i = 0; i < 100; i++) {
values.at<float>(i, 1) = 10 + i;
}
cout<<values.at<float>(0, 1)<<endl; // prints 10
cout<<values.at<float>(1, 1)<<endl; // prints 11
cout<<values.row(0) <<endl; // prints 0
cout<<values.row(1)<<endl; // prints 10
cout<<values.row(2)<<endl; // prints 11
问题是 row(0)
总是 returns 0 并且使用 row(1)...row(n)
访问 Mat 相对于方法 at<>()
有 +1 的偏移量,这看起来很奇怪大部头书。我是不是遗漏了什么或者是 OpenCv 的已知问题?
看看Mat::zeros()
,你的称呼方式是rows = 100
cols = 1
。当您使用 i = 0
调用 values.at<float>(i, 1)
时,您正在访问第 0 行和第 1 列的元素,这当然超出了您的 Mat.
将 values.at<float>(i, 1)
更改为 values.at<float>(i, 0)
并供将来参考 运行 您在调试模式下构建,其中 OpenCV 断言将捕获您的错误。
我正在使用 OpenCv Mat 访问和复制 (C++)。考虑以下示例:
cv::Mat values = cv::Mat::zeros(100, 1, CV_32FC1);
for (int i = 0; i < 100; i++) {
values.at<float>(i, 1) = 10 + i;
}
cout<<values.at<float>(0, 1)<<endl; // prints 10
cout<<values.at<float>(1, 1)<<endl; // prints 11
cout<<values.row(0) <<endl; // prints 0
cout<<values.row(1)<<endl; // prints 10
cout<<values.row(2)<<endl; // prints 11
问题是 row(0)
总是 returns 0 并且使用 row(1)...row(n)
访问 Mat 相对于方法 at<>()
有 +1 的偏移量,这看起来很奇怪大部头书。我是不是遗漏了什么或者是 OpenCv 的已知问题?
看看Mat::zeros()
,你的称呼方式是rows = 100
cols = 1
。当您使用 i = 0
调用 values.at<float>(i, 1)
时,您正在访问第 0 行和第 1 列的元素,这当然超出了您的 Mat.
将 values.at<float>(i, 1)
更改为 values.at<float>(i, 0)
并供将来参考 运行 您在调试模式下构建,其中 OpenCV 断言将捕获您的错误。