PCL 低層次視覺 點雲濾波(基於點雲頻率)

2021-09-07 04:00:34 字數 2768 閱讀 8430

今天在閱讀分割有關的文獻時,驚喜的發現,點雲和影象一樣,有可能也存在頻率的概念。但這個概念並未在文獻中出現也未被使用,謹在本博文中濫用一下「高頻」一詞。點雲表達的是三維空間中的一種資訊,這種資訊本身並沒有一一對應的函式值。故點雲本身並沒有在講訴一種變化的訊號。但在抽象意義上,點雲必然是在表達某種訊號的,雖然沒有明確的時間關係,但應該會存在某種空間關係(例如lidar點雲)。我們可以人為的指定點雲空間中的乙個點(例如scan的重心或lidar的「源」),基於此點來討論點雲在各個方向上所謂的頻率。

在傳統的訊號處理中,高頻訊號一般指訊號變化快,低頻訊號一般指訊號變化緩慢。在影象處理中,高低頻的概念被引申至不同方向上影象灰度的變化,傅利葉變換可以用於提取影象的週期成分濾除布紋雜訊。在點雲處理中,定義:點雲法線向量差為點雲所表達的訊號。換言之,如果某處點雲曲率大,則點雲表達的是乙個變化的訊號。如果點雲曲率小,則其表達的是乙個不變的訊號。這和我們的直觀感受也是相近的,地面曲率小,它表達的資訊量也小;人的五官部分曲率大,其表達了整個scan中最大的資訊量。

雖然點雲頻率之前並沒有被討論,但使用頻率資訊的思想已經被廣泛的應用在了各個方面,最著名的莫過於don演算法。don演算法被作者歸類於點雲分割演算法中,但我認為並不準確,本質上don只是一種前處理,應該算是一種比較先進的點雲濾波演算法。分割本質上還是由歐式分割演算法完成的。don 是 difference of normal 的簡寫。演算法的目的是在去除點雲低頻濾波,低頻資訊(例如建築物牆面,地面)往往會對分割產生干擾,高頻資訊(例如建築物窗框,路面障礙錐)往往尺度上很小,直接採用 基於臨近資訊 的濾波器會將此類資訊合併至牆面或路面中。所以don演算法利用了多尺度空間的思想,演算法如下:

在小尺度上計算點雲法線1

在大尺度上計算點雲法線2

法線1-法線2

濾去3中值較小的點

歐式分割

顯然,在小尺度上是可以對高頻資訊進行檢測的,此演算法可以很好的小尺度高頻資訊。其在大規模點雲(如lidar點雲)中優勢尤其明顯。

演算法執行過程可用圖表示為:

演算法實現過程可表示為:

//

create a search tree, use kdtreee for non-organized data.

pcl::search::search::ptr tree;

if (cloud->isorganized ())

else

//set the input pointcloud for the search tree

tree->setinputcloud (cloud);

//生成法線估計器(omp是平行計算,忽略)

pcl::normalestimationompne;

ne.setinputcloud (cloud);

ne.setsearchmethod (tree);

//設定法線方向(要做差,同向很重要)

ne.setviewpoint (std::numeric_limits::max (), std::numeric_limits::max (), std::numeric_limits::max ());

//計算小尺度法線

pcl::pointcloud::ptr normals_large_scale (new pcl::pointcloud);

ne.setradiussearch (scale2);

ne.compute (*normals_large_scale);

//計算大尺度法線

pcl::pointcloud::ptr normals_large_scale (new pcl::pointcloud);

ne.setradiussearch (scale2);

ne.compute (*normals_large_scale);

//生成don分割器

pcl::differenceofnormalsestimationdon;

don.setinputcloud (cloud);

don.setnormalscalelarge (normals_large_scale);

don.setnormalscalesmall (normals_small_scale);

//計算法線差

pointcloud::ptr doncloud (new pcl::pointcloud);

copypointcloud

(*cloud, *doncloud);

don.computefeature (*doncloud);

//生成濾波條件:把法線差和閾值比

pcl::conditionor::ptr range_cond (

new pcl::conditionor()

);range_cond->addcomparison (pcl::fieldcomparison::constptr (

new pcl::fieldcomparison("

curvature

", pcl::comparisonops::gt, threshold))

);//

生成條件濾波器,輸入濾波條件和點雲

pcl::conditionalremovalcondrem (range_cond);

condrem.setinputcloud (doncloud);

//匯出濾波結果

pcl::pointcloud::ptr doncloud_filtered (new pcl::pointcloud);

condrem.filter (*doncloud_filtered);

//歐式聚類~~~(略)

PCL 低層次視覺 點雲濾波(初步處理)

點雲濾波是點雲處理的基本步驟,也是進行 high level 三維影象處理之前必須要進行的預處理。其作用類似於訊號處理中的濾波,但實現手段卻和訊號處理不一樣。我認為原因有以下幾個方面 點雲不是函式,對於複雜三維外形其x,y,z之間並非以某種規律或某種數值關係定義。所以點雲無法建立橫縱座標之間的聯絡。...

PCL 低層次視覺 點雲分割(RanSaC)

點雲分割可謂點雲處理的精髓,也是三維影象相對二維影象最大優勢的體現。不過多插一句,自niloy j mitra教授的global contrast based salient region detection出現,最優分割到底鹿死誰手還不好說。暫且不論他開掛的影象處理演算法,先安心做乙個pcl吹 點...

PCL 低層次視覺 關鍵點檢測(Harris)

除去narf這種和特徵檢測聯絡比較緊密的方法外,一般來說特徵檢測都會對曲率變化比較劇烈的點更敏感。harris演算法是影象檢測識別演算法中非常重要的乙個演算法,其對物體姿態變化魯棒性好,對旋轉不敏感,可以很好的檢測出物體的角點。甚至對於標定演算法而言,harris角點檢測是使之能成功進行的基礎。ha...