我是新的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坐标都必须被消除。
如果除了我目前正在做的事情之外,还有更好的方法来做这件事,请告知。
谢谢=)
发布于 2014-11-20 13:33:43
对于1600 x 3
大小的整形A
,您可以使用这个-
A(~any(isinf(A) | isnan(A),2),:)
如果要删除的行数很小,则可以直接删除它们以获得更好的性能-
A(any(isinf(A) | isnan(A),2),:) = [];
发布于 2014-11-20 13:42:04
我认为最简单的方法是使用isnan(A)和isinf(A)函数来查找NaNs和Infs。这个解决方案适用于大型矩阵(我个人使用这类解的矩阵要比您的大得多)。试着:
rowstoremove = (sum(isnan(A),2) ~= 0) | (sum(isinf(A),2) ~= 0);
A(rowstoremove,:) = [];
这应该能起作用。
发布于 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
https://stackoverflow.com/questions/27040764
复制相似问题