How to use the correct type name when using OpenCV cv::Mat.at function
描述情况可能比描述问题容易得多。我使用 OpenCV 在 C 中使用以下两行代码:
1
2 |
std::cout <<“value near i,j:” << myMat(Rect(i,j,2,2)) << std::endl;
std::cout <<“value at i,j:” << myMat.at<double>(i,j) << std::endl; |
我得到以下结果:
1
2 3 |
value near i,j: [34, 42;
39, 44] value at i,j: 24 |
我认为第一个值 (24) 中的第一个数字和第二行 (34) 中的值应该相等。 myMat 中的数据类型目前应定义为 CV_64F。我的结论是,从 OpenCV 数据类型转换为 C 原始类型时我做错了,因为我最初使用 CV_16S 时的值要差得多。那么我需要做什么样的更正才能正确访问 cv::Mat 构造中的值?
P.S: myMat 的创建和分配如下:
1
2 3 |
Mat yourMat, myMat;
[… yourMat is assigned …] Sobel(yourMat, myMat, CV_64F, 1, 0, 3, 1, 0, BORDER_DEFAULT); |
P.S.2:我在这里发现了一个类似的问题,但那里的答案似乎只是分配中的一种解决方法。
你应该在第二行切换i,j:myMat.at<double>(j,i)
在 myMat(Rect(i,j,2,2)) 中,您正在使用 Rect 构造函数:
1
|
x, y, width, height
|
所以你的 Rect 的左上角在 (x,y) = (i, j) 中。但是,当您使用 .at 访问一个值时,您会使用 .at<Tp>(row, col) 访问它,这是 (x,y) 的倒数,因为 row = y 和 col = x.
所以你正在有效地读取位置 (y, x) = (j, i).
的值
使用 CV_16U 类型的矩阵时,您需要使用 .at<Tp> 访问它:
- CV_16UC1 : m.at<ushort>
- CV_16UC2 : m.at<Vec2w>
- CV_16UC3 : m.at<Vec3w>
- CV_16UC4 : m.at<Vec4w>
或者你可以使用:
- Mat1w
- Mat2w
- Mat3w
- Mat4w
并在没有 .at 的情况下访问矩阵,但只使用括号:m(r,c)
- 好点。我知道 Mat.at 和 Rect 的两个不同参数顺序,但似乎我没有设法将它们联系在一起。事实证明,我推断这是一个类型问题(在这种情况下)是错误的,你的回答解决了我的问题。只是为了匹配主题,如果有人愿意评论问题的类型匹配部分,那就太好了:如果 CV 数据类型是 CV_16S,我们将如何使用 Mat.at 命令?因为那时 myMat.at<double>(j,i)、myMat.at<int>(j,i) 或 myMat.at<long>(j,i) 仍然会给出错误的结果。
- 谢谢你,伟大的工作。在您的指导下,我还发现了这个有用的链接,其中包含 OpenCV 中 Mat 类型的完整列表及其相应的 C 类型。
来源:https://www.codenong.com/40846752/