首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以最快的方式删除点云中的Inf和NaN值

以最快的方式删除点云中的Inf和NaN值
EN

Stack Overflow用户
提问于 2014-11-20 13:24:27
回答 3查看 1.4K关注 0票数 3

我是新的MATLAB和刚刚开始工作的立体视觉。三维立体重建后的场景,从点云我得到,我想忽略所有的协调值NaN或Inf。

为此,我遵循以下程序:

对于尺寸为40×40的图像,点云是40×40×3的矩阵(3由于3D;X,Y和Z协调)。

从三维点云(40×40×3)中,得到一个维数为1600×3的矩阵。每一列对应于X,Y和Z坐标。

在这个步骤中,如果我找到任何Inf或NaN元素,我将尝试删除整个行。

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

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

我希望消除所有具有Inf或NaN元素的行。

预期结果为: 1,11,21;6,16,26;

因为我将处理4000 X 3000维的图像,我想要一个非常快速和高效的方法来做到这一点。

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

如果除了我目前正在做的事情之外,还有更好的方法来做这件事,请告知。

谢谢=)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-20 13:33:43

对于1600 x 3大小的整形A,您可以使用这个-

代码语言:javascript
运行
复制
A(~any(isinf(A) | isnan(A),2),:)

如果要删除的行数很小,则可以直接删除它们以获得更好的性能-

代码语言:javascript
运行
复制
A(any(isinf(A) | isnan(A),2),:) = [];
票数 6
EN

Stack Overflow用户

发布于 2014-11-20 13:42:04

我认为最简单的方法是使用isnan(A)和isinf(A)函数来查找NaNs和Infs。这个解决方案适用于大型矩阵(我个人使用这类解的矩阵要比您的大得多)。试着:

代码语言:javascript
运行
复制
rowstoremove = (sum(isnan(A),2) ~= 0) | (sum(isinf(A),2) ~= 0);
A(rowstoremove,:) = [];

这应该能起作用。

票数 2
EN

Stack Overflow用户

发布于 2016-06-17 21:52:02

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27040764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档