一、VoxelGrid 体素滤波器
体素滤波和下采样滤波是一样的,对于点云只不过创建一个三维的体素格栅,用每个体素的重心近似体素中的其他的点。
二、实现:
代码:
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr m_current_cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (-1 == pcl::io::loadPCDFile("empty desktop.pcd", *m_current_cloud))//放到与工程中的主.cpp同一位置的文件夹下
{
cout << "加载文件失败!" << endl;
return -1;
}
cout << "原始点云的点数: " << m_current_cloud->points.size() << endl;
pcl::PointCloud<pcl::PointXYZ>::Ptr newcloud(new pcl::PointCloud<pcl::PointXYZ>);
// 对这个点云进行下采样
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud(m_current_cloud);
sor.setLeafSize(0.1f,0.1f,0.1f); // 采样间隔
sor.filter(*newcloud); // 采样 并输出到新的点云里面
cout <<"降采样之后的点云的点数: " << newcloud->points.size() << endl;
// 可视化
// boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("Normal viewer"));
pcl::visualization::PCLVisualizer viewer("demo");
// 设置点云的显示两个点云到同一个viewer 中
int v1(0);
int v2(1);
viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1);
viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);
// 设置点云颜色
float bckgr_gray_level = 0.0;
float txt_gray_lvl = 1.0 - bckgr_gray_level;
// 显示原始点云
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_in_color_h(m_current_cloud, (int)255 * txt_gray_lvl, (int)255 * txt_gray_lvl, (int)255 * txt_gray_lvl);
viewer.addPointCloud(m_current_cloud, cloud_in_color_h, "cloud_in_v1", v1);
// 显示降采样之后的滤波
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_green(newcloud, 50, 180, 70);
viewer.addPointCloud(newcloud, cloud_out_green, "cloud_out", v2);
// 这种背景 只设置
viewer.setBackgroundColor(bckgr_gray_level, bckgr_gray_level, bckgr_gray_level, v2);
// 这种vtk窗口的大小
viewer.setSize(1280, 1024);
// 点云显示
while (!viewer.wasStopped())
{
viewer.spinOnce();
}
return 0;
}