【问题标题】:Remove Inf and NaN values in a Point Cloud in the fastest way以最快的方式删除点云中的 Inf 和 NaN 值
【发布时间】:2015-01-18 09:11:44
【问题描述】:

我是 MATLAB 新手,刚开始研究 Stereo Vision。在对场景进行 3D 立体重建后,从我获得的点云中,我想忽略所有值为 NaN 或 Inf 的坐标。

为此,我遵循以下程序:

对于尺寸为 40 X 40 的图像,点云是 40 X 40 X 3 的矩阵。(3 因为 3D;X、Y 和 Z 坐标)。

从 3D 点云 (40 X 40 X 3),我重新获得一个尺寸为 1600 X 3 的矩阵。3 列中的每一列对应于 X、Y 和 Z 坐标

在这一步,如果我发现任何 Inf 或 NaN 元素,我会尝试删除整行。

例如,在连接步骤之后,如果我有一个矩阵 A

A = [1, 11, 21;南,12, 22; 3、13、Inf;南,14,南; 5、Inf、NaN; 6, 16, 26];

我想消除所有包含 Inf 或 NaN 元素的行。

所以预期的结果是:[1, 11, 21; 6, 16, 26];

由于我将处理尺寸为 4000 X 3000 的图像,因此我想要一种非常快速有效的方法。

我这样做是为了在我获得的点云中拟合一个平面(最佳拟合)。拟合平面的函数不采用 Inf 和 NaN 值。所以即使找到一个 NaN 值,也必须消除所有对应的 X、Y 和 Z 坐标。

如果除了我目前正在做的事情之外还有更好的方法可以做到这一点,请告知。

谢谢你=)

【问题讨论】:

    标签: matlab image-processing matlab-cvst point-clouds stereo-3d


    【解决方案1】:

    对于1600 x 3 大小的重塑A,你可以使用这个-

    A(~any(isinf(A) | isnan(A),2),:)
    

    如果要删除的行数较少,可以直接删除,以获得更好的性能-

    A(any(isinf(A) | isnan(A),2),:) = [];
    

    【讨论】:

    • 还有A(all(isfinite(A),2),:)
    • @LuisMendo 你应该把它作为另一个答案发布!
    • 不。这只是你的一个小变化:-)
    【解决方案2】:

    我认为最简单的方法是使用 isnan(A) 和 isinf(A) 函数来查找 NaN 和 Inf。该解决方案适用于大型矩阵(我个人将此类解决方案用于比您的矩阵大得多的矩阵)。试试看:

    rowstoremove = (sum(isnan(A),2) ~= 0) | (sum(isinf(A),2) ~= 0);
    A(rowstoremove,:) = [];
    

    这应该可以解决问题。

    【讨论】:

      【解决方案3】:

      removeInvalidPoints 函数也可以在 matlab 中使用,它可以删除具有 Inf 或 NaN 坐标的点。您可以从这里查看:http://www.mathworks.com/help/vision/ref/pointcloud.removeinvalidpoints.html

      由于这些点正在考虑点云中的噪声,因此更好的方法是去噪。因为除了 NaN 和 Inf 坐标之外,您还可以从数据中删除异常值。 pcdenoise 可以用来做到这一点。但是您应该将数据转换为 matlab 的 pointCloud 对象(您可以使用 pointCloud 函数来实现)。在这里查看更多信息:http://www.mathworks.com/help/vision/ref/pcdenoise.html

      【讨论】:

        猜你喜欢
        • 2018-01-26
        • 2016-08-15
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 2017-08-19
        • 2019-01-09
        • 2018-03-27
        相关资源
        最近更新 更多