法線空間采樣
NormalSpaceSampling即:法線空間采樣,它在法向量空間內(nèi)均勻隨機(jī)抽樣,使所選點(diǎn)之間的法線分布盡可能大,結(jié)果表現(xiàn)為地物特征變化大的地方剩余點(diǎn)較多,變化小的地方剩余點(diǎn)稀少,可有效保持地物特征。實(shí)現(xiàn)方法如下:
1、首先計(jì)算每個(gè)點(diǎn)的K領(lǐng)域,然后計(jì)算點(diǎn)到領(lǐng)域點(diǎn)的法線夾角值,以此來近似達(dá)到曲率的效果并提高計(jì)算效率,因?yàn)榍试酱蟮牡胤剑瑠A角值越大。
2、設(shè)置一個(gè)角度閾值,當(dāng)點(diǎn)的領(lǐng)域夾角值大于閾值時(shí)被認(rèn)為是特征明顯的區(qū)域,其余區(qū)域?yàn)椴幻黠@區(qū)域。
3、對明顯和不明顯區(qū)域進(jìn)行均勻采樣,采樣數(shù)分別為U_(1-V)和U_V,U是目標(biāo)采樣數(shù),V是均勻采樣性。
// 創(chuàng)建基于鄰域的法向估計(jì)類對象
// // 基于omp并行加速,需配置開啟OpenMP
// pcl::NormalEstimationOMP< pcl::PointXYZ, pcl::Normal > ne;
// ne.setNumberOfThreads(10);
pcl::NormalEstimation< pcl::PointXYZ, pcl::Normal > ne;
// 創(chuàng)建一個(gè)空的kdtree對象,并把它傳遞給法線估計(jì)對象,
// 用于創(chuàng)建基于輸入點(diǎn)云數(shù)據(jù)的鄰域搜索kdtree
pcl::search::KdTree< pcl::PointXYZ >::Ptr
tree(new pcl::search::KdTree< pcl::PointXYZ >());
// 傳入待估計(jì)法線的點(diǎn)云數(shù)據(jù),智能指針
ne.setInputCloud(cloud_src);
// 傳入kdtree對象,智能指針
ne.setSearchMethod(tree);
// 設(shè)置鄰域搜索半徑
ne.setRadiusSearch(0.1f); // 設(shè)置半徑時(shí),要考慮到點(diǎn)云空間間距
// // 也可以設(shè)置最近鄰點(diǎn)個(gè)數(shù)
// ne.setKSearch(25);
// 設(shè)置視點(diǎn)源點(diǎn),用于調(diào)整點(diǎn)云法向(指向視點(diǎn)),默認(rèn)(0,0,0)
ne.setViewPoint(0,0,0);
// 計(jì)算法線數(shù)據(jù)
ne.compute(*cloud_normals);
// 通過concatenateFields函數(shù)將point和normal組合起來形成PointNormal點(diǎn)云數(shù)據(jù)
pcl::PointCloud< pcl::PointNormal >::Ptr
cloud_with_normal(new pcl::PointCloud< pcl::PointNormal >());
pcl::PointCloud< pcl::PointNormal >::Ptr
cloud_with_normal_sampled(new pcl::PointCloud< pcl::PointNormal >());
pcl::concatenateFields(*cloud_src, *cloud_normals, *cloud_with_normal);
// 創(chuàng)建法向空間采樣(模板)類對象
pcl::NormalSpaceSampling< pcl::PointNormal, pcl::Normal > nss;
// 設(shè)置xyz三個(gè)法向空間的分類組數(shù),此處設(shè)置為一致,根據(jù)具體場景可以調(diào)整
const int kBinNum = 8;
nss.setBins(kBinNum, kBinNum, kBinNum);
// 如果傳入的是有序點(diǎn)云,此處可以嘗試設(shè)置為true
nss.setKeepOrganized(false);
// 設(shè)置隨機(jī)種子,這樣可以保證同樣的輸入可以得到同樣的結(jié)果,便于debug分析
nss.setSeed(200); // random seed
// 傳入待采樣的點(diǎn)云數(shù)據(jù)
nss.setInputCloud(cloud_with_normal);
// 傳入用于采樣分析的法線數(shù)據(jù),需與傳入點(diǎn)云數(shù)據(jù)一一對應(yīng)
nss.setNormals(cloud_normals);
// 設(shè)置采樣總數(shù),即目標(biāo)點(diǎn)云的總數(shù)據(jù)量
const float kSampleRatio = 0.1f;
nss.setSample(cloud_with_normal- >size()*kSampleRatio);
// 執(zhí)行采樣并帶出采樣結(jié)果
nss.filter(*cloud_with_normal_sampled);
-
plc
+關(guān)注
關(guān)注
5014文章
13347瀏覽量
464432 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7104瀏覽量
89295 -
采樣
+關(guān)注
關(guān)注
1文章
123瀏覽量
25586
發(fā)布評論請先 登錄
相關(guān)推薦
評論