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


  關鍵點檢測本質上來說,並不是一個獨立的部分,它往往和特征描述聯系在一起,再將特征描述和識別、尋物聯系在一起。關鍵點檢測可以說是通往高層次視覺的重要基礎。但本章節僅在低層次視覺上討論點雲處理問題,故所有討論都在關鍵點檢測上點到為止。NARF 算法實際上可以分成兩個部分,第一個部分是關鍵點提取,第二個部分是關鍵點信息描述,本文僅涉及第一個部分。

  在文章開始之前,有非常重要的一點要說明,點雲中任意一點,都有一定概率作為關鍵點。關鍵點也是來自原始點雲中的一個元素。和圖像的邊緣提取或者關鍵點檢測算法追求n次插值,最終求的亞像素坐標不同,點雲的關鍵點只在乎找到那個點。

1. 邊緣提取

  首先聲明本文所有思想算法公式均來自:Point Feature Extraction on 3D Range Scans Taking into Account Object Boundaries 

  在正式開始關鍵點提取之前,有必要先進行邊緣提取。原因是相對於其他點,邊緣上的點更有可能是關鍵點。和圖像的邊緣不同(灰度明顯變化),點雲的邊緣有更明確的物理意義。對點雲而言,場景的邊緣代表前景物體和背景物體的分界線。所以,點雲的邊緣又分為三種:前景邊緣,背景邊緣,陰影邊緣。

  rangeImage 是一個天然適合用於邊緣提取的框架。在這里需要做一些假設:每個rangeImage像素中假設都只有一個點(顯然在生成rangeImage的時候點雲是被壓縮了的,壓縮了多少和rangeImage的分辨率有關,分辨率不能太小,否則rangeImage上會有"洞”,分辨率太大則丟失很多信息)。

  三維點雲的邊緣有個很重要的特征,就是點a 和點b 如果在 rangImage 上是相鄰的,然而在三維距離上卻很遠,那么多半這里就有邊緣。由於三維點雲的規模和稀疏性,“很遠”這個概念很難描述清楚。到底多遠算遠?這里引入一個橫向的比較是合適的。這種比較方法可以自適應點雲的稀疏性。所謂的橫向比較就是和 某點周圍的點相比較。 這個周圍有多大?不管多大,反正就是在某點pi的rangeImage 上取一個方窗。假設像素邊長為s. 那么一共就取了s^2個點。接下來分三種情況來討論所謂的邊緣:

  1.這個點在某個平面上,邊長為 s 的方窗沒有涉及到邊緣

  2.這個點恰好在某條邊緣上,邊長 s 的方窗一半在邊緣左邊,一半在右邊

  3.這個點恰好處於某個角點上,邊長 s 的方窗可能只有 1/4 與 pi 處於同一個平面

  如果將 pi 與不同點距離進行排序,得到一系列的距離,d0 表示與 pi 距離最近的點,顯然是 pi 自己。 ds^2 是與pi 最遠的點,這就有可能是跨越邊緣的點了。 選擇一個dm,作為與m同平面,但距離最遠的點。也就是說,如果d0~ds^2是一個連續遞增的數列,那么dm可以取平均值。如果這個數列存在某個階躍跳動(可能會形成類似階躍信號)那么則發生階躍的地方應該是有邊緣存在,不妨取階躍點為dm(距離較小的按個階躍點)原文並未如此表述此段落,原文取s=5, m=9 作為m點的一個合理估計。

  對任意一個點,進行打分,來判斷該點作為邊緣點有多大可能性。首先,邊緣可能會在某點的:上,下,左,右四個方向。

  所以只要把pi 和 pi 右邊的點求相對距離。 並把這個相對距離和dm進行比較,就可以判斷邊緣是不是在該點右邊。如果距離遠大於dm,顯然該點右邊的鄰點就和pi不是同一個平面了。

  

  為了增加對噪聲的適應能力,取右邊的點為右邊幾個點的平均數。接下來依據此信息對該點進行打分。

  其中deta 就是dm. dright = || pi pright ||. 

  最后再取大於0.8的Sright,並進行非極大值抑制。就可以得到物體的邊緣了

  

2. 關鍵點提取

    在提取關鍵點時,邊緣應該作為一個重要的參考依據。但一定不是唯一的依據。對於某個物體來說關鍵點應該是表達了某些特征的點,而不僅僅是邊緣點。所以在設計關鍵點提取算法時,需要考慮到以下一些因素:

  i) it must take information about borders and the surface structure into account;

   邊緣和曲面結構都要考慮進去

     ii) it must select positions that can be reliably detected even if the object is observed from another perspective;

       關鍵點要能重復

  iii) the points must be on positions that provide stable areas for normal estimation or the descriptor calculation in general.

   關鍵點最好落在比較穩定的區域,方便提取法線 

  對於點雲構成的曲面而言,某處的曲率無疑是一個非常重要的結構描述因素。某點的曲率越大,則該點處曲面變化越劇烈。在2D rangeImage 上,去 pi 點及其周邊與之距離小於2deta的點,進行PCA主成分分析。可以得到一個 主方向v,以及曲率值 lamda. 注意, v 必然是一個三維向量。

  那么對於邊緣點,可以取其 權重 w 為1 , v 為邊緣方向。

  對於其他點,取權重 w 為 1-(1-lamda)^3 , 方向為 v 在平面 p上的投影。 平面 p 垂直於 pi 與原點連線。

  到此位置,每個點都有了兩個量,一個權重,一個方向。

  將權重與方向帶入下列式子 I 就是某點 為特征點的可能性。

  最后進行極大值抑制,就可以得到一些特征點了。

3. 關於特征點提取的一些思考

  在我看來,本文提出的算法效果上可能確實不錯,但是這算法里面太多經驗值與神秘數。各種式子沒有明確的物理意義,只是單純為了獲得一個較好的結果設計出來 "打分"的。 這種算法實在談不上優雅,當然,我連這種不優雅的算法也設計不出來。。。。。。。

  點雲的特征點提取應該與后面的特征描述是松耦合的。確實不得不承認,針對不同的點雲:稀疏的,致密的,有序的,無序的,有遮擋的,高精測量的.......設計不同的關鍵點提取算法也無可厚非。總結出的關鍵點提取算法原則就是要尺度不變,魯棒性好,至於是否一定要存在於平坦區域,我覺得並不一定。不同的關鍵點提取算法可以和不同的特征描述算法進行組合,最終得到一個較好的效果。如果非要把關鍵點提取算法和特征描述算法緊耦合,那勢必會失去一部分靈活性。

  最后還有一點想要吐槽的是,點雲中的點為什么不應該自帶是否是關鍵點的性質,而需要我們來進行檢測?這顯然不符合面向對象的設計原則........我覺的應該有某種點雲采集方法,得到的點雲可以有以下性質:

  point.is_key_point = 1/0.

  這多好~

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM