以最快的方式删除Point Cloud中的Inf和NaN值

时间:2014-11-20 13:24:27

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

我是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; NaN,12,22; 3,13,Inf; NaN,14,N​​aN; 5,Inf,NaN; 6,16,26];

我想要消除所有具有Inf或NaN元素的行。

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

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

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

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

谢谢=)

3 个答案:

答案 0 :(得分:6)

对于1600 x 3大小的重新塑造A,您可以使用此< - p>

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

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

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

答案 1 :(得分:2)

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

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

这应该可以解决问题。

答案 2 :(得分:1)

matlab中也提供了

removeInvalidPoints功能,可以删除带有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