我是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,NaN; 5,Inf,NaN; 6,16,26];
我想要消除所有具有Inf或NaN元素的行。
所以预期的结果是:[1,11,21; 6,16,26];
由于我将使用尺寸为4000 X 3000的图像,我想要一种非常快速有效的方法。
我这样做是为了在我获得的点云中拟合平面(最合适)。拟合平面的函数不采用Inf和NaN值。因此,即使找到一个NaN值,也必须消除所有相应的X,Y和Z坐标。
除了目前我正在做的事情之外,如果有更好的方法,请通知。
谢谢=)
答案 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)
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