gpt4 book ai didi

c++ - 为 NAN 值过滤 OpenCV Mat

转载 作者:太空狗 更新时间:2023-10-29 20:02:22 24 4
gpt4 key购买 nike

有没有直接的方法来创建掩码,其中值在 cv::Mat_<double> 中?与 NAN 相比?

cv::Mat_<real> mat = ...
cv::Mat_<uchar> mask = (mat == NAN);

不起作用,因为 f == NAN始终为假,即使 f已分配 NAN .而且似乎没有 isnan() 的重载对于矩阵。

最佳答案

正如用户 pSoLT 所指出的,如果您想确定哪些值是 NaN,只需将矩阵与其自身进行比较即可。对于那些不相等的元素,它们将被视为 NaN by the standard definition .您可以使用该逻辑创建一个新掩码:

cv::Mat mask = cv::Mat(mat != mat);

mat 将是一个包含 NaN 值的矩阵,mask 将是一个 CV_8UC1(即 uchar) 类型矩阵,如果值为 NaN,则每个元素为 0xFF,否则为 0x00

OpenCV 论坛上的这篇帖子也可能有帮助:http://answers.opencv.org/question/2221/create-a-mask-for-nan-cells/


编辑(截至 2020 年 4 月 23 日)

正如评论中提到的以及这篇文章中的一个答案,上面的 bool 表达式是错误的,可能会导致不一致的行为。这是由于 OpenCV 做出的某些优化决策。请查看此 Github 问题:https://github.com/opencv/opencv/issues/16465

解决方案是使用 cv::patchNaNs()为了解决这个问题,它将 NaN 的值转换为特定的数字。

要复制在问题中创建掩码,请注意 patchNaNs 执行值的就地替换,因此您必须制作图像的两个拷贝,使用 patchNaNs NaN 值设置为每个图像的不同值,然后检查两个值是否同时出现在相同位置。换句话说:

cv::Mat mat1 = mat.clone();
cv::Mat mat2 = mat.clone();
cv::patchNaNs(mat1, 128);
cv::patchNaNs(mat2, 200);
cv::Mat mask = mat1 == 128 & mat2 == 200;

mask 将为您提供此答案原始版本中预期的结果。

关于c++ - 为 NAN 值过滤 OpenCV Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41759247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com