基礎下采樣
1.1 點云隨機下采樣
點云下采樣是對點云以一定的采樣規則重新進行采樣,目的是在保證點云整體幾何特征不變的情況下,降低點云的密度,進而可以降低相關處理的數據量和算法復雜度。
隨機下采樣顧名思義,隨機下采樣就似乎在原始點云中隨機采樣一定點數的點。這種方法最終得到的點云數量也是固定的。
pcl::PointCloud< PointT >::Ptr cloud_sub(new pcl::PointCloud< PointT >); //隨機下采樣點云
pcl::RandomSample< PointT > rs; //創建濾波器對象
rs.setInputCloud(cloud); //設置待濾波點云
rs.setSample(20000); //設置下采樣點云的點數
//rs.setSeed(1); //設置隨機函數種子點
rs.filter(*cloud_sub); //執行下采樣濾波,保存濾波結果于cloud_sub
1.2 體素下采樣
體素下采樣的原理如圖1所示,首先將點云空間進行網格化,也稱體素化,即圖1(b),網格化后的每一個格子稱為體素,在這些劃分為一個個極小的格子中包含一些點,然后對這些點取平均或加權平均得到一個點,以此來替代原來網格中所有的點,即圖1(c)中藍色的點。顯然,網格選取越大則采樣之后的點云越少,處理速度變快,但會對原先點云過度模糊,網格選取越小,則作用相反。
pcl::VoxelGrid< pcl::PointXYZ > sor; //創建體素網格采樣處理對象
sor.setInputCloud(cloud); //設置輸入點云
sor.setLeafSize(0.01f, 0.01f, 0.01f); //設置體素大小,單位:m
sor.filter(*cloud_filtered); //進行下采樣
1.3 均勻采樣
均勻采樣的原理類似于體素化網格采樣方法,同樣是將點云空間進行劃分,不過是以半徑=r的球體,在當前球體所有點中選擇距離球體中心最近的點替代所有點,注意,此時點的位置是不發生移動的。
球體半徑選取越大則采樣之后的點云越少,處理速度變快,但會對原先點云過度模糊,網格選取越小,則作用相反。
pcl::UniformSampling< pcl::PointXYZ > form; // 創建均勻采樣對象
form.setInputCloud(cloud); //設置輸入點云
form.setRadiusSearch(0.02f); //設置半徑大小,單位:m
form.filter(*after_cloud); //執行濾波處理
1.4 增采樣
增采樣的特點是可極大的增加點云數據,但由于內插點的不確定性會導致最后輸出的結果不一定準確。
//創建增采樣對象
pcl::MovingLeastSquares< pcl::PointXYZ,pcl::PointXYZ > filter;
filter.setInputCloud(cloud); //設置輸入點云
pcl::search::KdTree< pcl::PointXYZ >::Ptr kdtree; //定義搜索方法
filter.setSearchMethod(kdtree); //設置搜索方法
filter.setSearchRadius(0.03); //設置搜索鄰域的半徑為3cm
//Upsampling 采樣的方法還有 DISTINCT_CLOUD, RANDOM_UNIFORM_DENSITY
filter.setUpsamplingMethod(pcl::MovingLeastSquares< pcl::PointXYZ, pcl::PointXYZ >::SAMPLE_LOCAL_PLANE); //對點云進行上采樣
filter.setUpsamplingRadius(0.03); //設置采樣半徑大小,3cm
filter.setUpsamplingStepSize(0.02); //設置采樣步長大小,2cm
filter.process(*after_cloud); //執行采樣操作
1.5 滑動最小二乘法采樣
滑動最小二乘法采樣的原理是將點云進行了滑動最小二乘法的映射,使得輸出的點云更加平滑。
pcl::PointCloud< pcl::PointNormal >::Ptr smoothedCloud(new pcl::PointCloud< pcl::PointNormal >); //定義法線
pcl::MovingLeastSquares< pcl::PointXYZ, pcl::PointNormal > filter;
pcl::search::KdTree< pcl::PointXYZ >::Ptr kdtree; //定義搜索方法
filter.setInputCloud(cloud); //設置輸入點云
filter.setUpsamplingMethod(); //增加密度較小區域的密度對于holes的填補卻無能為力,具體方法要結合參數使用
filter.setSearchRadius(10);// 用于擬合的K近鄰半徑。在這個半徑里進行表面映射和曲面擬合。半徑越小擬合后曲面的失真度越小,反之有可能出現過擬合的現象。
filter.setPolynomialFit(true); //對于法線的估計是有多項式還是僅僅依靠切線。true為加多項式;false不加,速度較快
filter.setPolynomialFit(3); // 擬合曲線的階數
filter.setComputeNormals(true); // 是否存儲點云的法向量,true 為存儲,false 不存儲
filter.setSearchMethod(kdtree); //設置搜索方法
filter.process(*smoothedCloud); //處理點云并輸出
-
濾波器
+關注
關注
161文章
7795瀏覽量
177996 -
plc
+關注
關注
5010文章
13271瀏覽量
463068 -
采樣
+關注
關注
1文章
121瀏覽量
25554
發布評論請先 登錄
相關推薦
評論