关于C#:使用OpenCV cv::Mat.at函数时如何使用正确的类型名 | 珊瑚贝

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/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9637.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?