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