PointCloud点云处理⽅法总结(代码案例版)
PointCloud 点云处理⽅法总结(代码案例版)
本⽂将⾃⼰在点云处理过程中,遇到的⼀些常⽤的具体⽅法进⾏总结,不介绍点云数据处理的基本概念,主要是处理过程中的代码总结,以及参考案例。
1. 点云数据类型转换:
ROS msg, PCLPointCloud2, PointXYZ三种数据类型之间的转换。
ROS msg to PCLPointCloud2
const nsor_msgs::PointCloud2ConstPtr& cloud_msg
pcl::PCLPointCloud2* cloud = new pcl::PCLPointCloud2;
pcl_conversions::toPCL(*cloud_msg, *cloud);
PCLPointCloud2 to ROS msg
nsor_msgs::PointCloud2 output;
pcl::PCLPointCloud2 cloud_filtered;
pcl_conversions::moveFromPCL(cloud_filtered, output);
PointXYZ to PCLPointCloud2
pcl::PointCloud<pcl::PointXYZ> local_map;
pcl::PCLPointCloud2* local_map_pc2_ptr = new pcl::PCLPointCloud2;
pcl::toPCLPointCloud2(local_map, *local_map_pc2_ptr);
PCLPointCloud2 to PointXYZ
bushido
pcl::PCLPointCloud2 local_map_pc2;
pcl::fromPCLPointCloud2(local_map_pc2, local_map);
ROS msg to PointXYZ
nsor_msgs::PointCloud2 output;
pcl::PointCloud<pcl::PointXYZ> icp_cloud_;
pcl::fromROSMsg(output, icp_cloud_);
adhocPointXYZ to ROS msg
pcl::toROSMsg(local_map,output);
pointer to const pointer
特别的,有时需要将指针转为常量指针
pcl::PCLPointCloud2* cloud = new pcl::PCLPointCloud2;
pcl::PCLPointCloud2ConstPtr cloudPtr(cloud);
2. 降采样点云:
点云常常占⽤较多计算资源,为了实时处理,需要进⾏稀疏化,这⾥
惊吓英文使⽤VoxelGrid滤波器进⾏降采样。
pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());
//创建滤波器
pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
sor.tInputCloud (cloud);
//设置点云稀疏程度
sor.tLeafSize (0.01f, 0.01f, 0.01f);
//降采样后输出到*cloud_filtered
sor.filter (*cloud_filtered);
详情见降采样点云
3. 剪裁点云:
机器⼈在运⾏的过程中,会⼀直采集点云加⼊到地图中,⽽那些较远处或者处于机器⼈后⾯的部分,通常不会⽤到,为了加快处理速度,需要对点云进⾏剪裁。
沿着某⼀个轴进⾏裁剪
pcl::PassThrough<pcl::PointXYZ> pass;
pass.tInputCloud (cloud);
//设置裁剪轴
pass.tFilterFieldName ("z");
//设置裁剪范围
pass.tFilterLimits (0.0, 1.0);
打招呼的英文//设置输出
pass.filter (*cloud_filtered);
那么,裁剪三个轴呢?注意,不能⼀次设置裁剪三个轴(我测试过程中是这样),需要分成三步
三个轴同时裁剪
{
pcl::PassThrough<pcl::PointXYZ> pass;
ill be missing youpass.tInputCloud(crop_cloud_ptr);
*crop_cloud_ptr = crop_cloud_;
// Crop horizontally
pass.tFilterFieldName("x");
pass.tFilterLimits(x_limit_left, x_limit_right);
pass.filter(crop_cloud_);
}
{
pcl::PassThrough<pcl::PointXYZ> pass;
pass.tInputCloud(crop_cloud_ptr);
*crop_cloud_ptr = crop_cloud_;
// Crop vertically
pass.tFilterFieldName("y");
pass.tFilterLimits(y_limit_above, y_limit_below);
pass.filter(crop_cloud_);
}
{
slots
pcl::PassThrough<pcl::PointXYZ> pass;
pass.tInputCloud(crop_cloud_ptr);
freestyle什么意思
*crop_cloud_ptr = crop_cloud_;
// Crop depth-wi
pass.tFilterFieldName("z");
pass.tFilterLimits(z_limit_behind, z_limit_ahead);
pass.filter(crop_cloud_);
}
发现另⼀个pcl::CropBox可以直接进⾏裁剪
CropBox裁剪
pcl::CropBox<pcl::PointXYZRGBA> boxFilter;加勒比海盗 剧情
boxFilter.tMin(Eigen::Vector4f(minX, minY, minZ, 1.0));
boxFilter.tMax(Eigen::Vector4f(maxX, maxY, maxZ, 1.0));
boxFilter.tInputCloud(body);
囧司徒每日秀中文网boxFilter.filter(*bodyFiltered);
4. 迭代最近点法ICP match:
使⽤迭代最近点法可以将两个具有相同特征的点云进⾏配准。
pcl::IterativeClostPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
icp.tInputSource(cloud_in);
icp.tInputTarget(cloud_out);
pcl::PointCloud<pcl::PointXYZ> Final;
icp.align(Final);
迭代最近点使⽤案例,,
5. 随机抽样⼀致算法Random Sample Connsus:
随机抽样⼀致算法可以在给定正确数据的情况下,去除点云中的由于错误的测量引起的离群点云数据。
//针对点云cloud,建⽴随机抽样⼀致的模型
pcl::SampleConnsusModelPlane<pcl::PointXYZ>::Ptr
model_p (new pcl::SampleConnsusModelPlane<pcl::PointXYZ> (cloud));
pcl::RandomSampleConnsus<pcl::PointXYZ> ransac (model_p);
ransac.tDistanceThreshold (.01);
//去除离群点后输出
具体例⼦见
2012上海高考物理相关开源代码推荐
maplab
ethzasl_icp_mapping
libpointmatcher