前言
在使用3D相机,例如结构光相机和线扫相机(线结构光相机、线激光传感器)时,采集得到的点云中可能存在一些无效点,有可能x、y、z都为无效值,或者其中一个坐标值为无效值。那么在进行其他点云处理之前,则需要先剔除点云中无效点,仅保留有效点。
代码:
bool cpRemoveInfPoints(pcl::PointCloud<pcl::PointXYZ>& cloud)
{
if (cloud.empty())
{
std::cout << "Error in [cpRemoveInfPoints]: Input cloud is empty" << std::endl;
return false;
}
int ProfileSize = cloud.size();
std::vector<int> indices;
pcl::removeNaNFromPointCloud(cloud, cloud, indices);
int PointSize = cloud.size();
pcl::PointCloud<pcl::PointXYZ> cloud_temp;
for (int j = 0; j < PointSize; ++j)
{
//pcl_isfinite
if (isfinite(cloud.points[j].x) && isfinite(cloud.points[j].y) && isfinite(cloud.points[j].z))
{
cloud_temp.emplace_back(cloud.points[j]);
}
}
cloud = cloud_temp;
return true;
}
上述代码中,pcl::removeNaNFromPointCloud(cloud, cloud, indices);是PCL库内部实现的去除Nan值的方法。在此之后又多做了一层处理。需要包含头文件#include <pcl/filters/filter.h>。有关于这个方法的说明可以点击。
“这种方法的问题是它不会保持点云仍然是有序点云。所有的点云都存储一个“宽度”和“高度”变量。在无序点云,总数为宽度相同,而高度设置为1。在有序的点云(像从相机拍摄像传感器如Kinect或Xtion的),宽度和高度都相同的像素的图像分辨率传感器的工作。点云分布在深度图像的行中,每一个点对应一个像素。成员函数”isorganized()”如果高度大于1时返回真。
由于移除NaNs无效点会改变点云的点的数量,它不再能保持组织与原来的宽高比,所以函数将设置高度1。这不是一个大问题,只有少数的PCL的算法工作明确要求是有序的点云(大多这样情况下会使用在优化上),但你必须考虑其中的影响。”