通常我們要確定某個規則物體,可以提取相應的幾何特徵,例如乙個球只需提取出球心座標和半徑大小即可唯一確定該球。本次建模物件主要是某大學主樓,每次處理的物件是主樓的一部分,且每一部分可以近似看作矩形。最後將已處理的部分同時用pcd_viewer_release.exe工具顯示,並將處理後的結果與主樓原始點雲顯示結果進行對比,看處理結果是否合理。
1. 將原始點雲進行平面分割,得到若干個平面點雲。【平面分割】
2. 對第一步中分割得到的平面進行聚類,聚類準則是若兩個平面近似平行且相距較近,則將這兩類聚為一類。【聚類】
3. 遍歷得到每個類別,將每個類別中的所有平面投影到其中乙個平面中。【投影】
4. 遍歷投影後的結果平面,獲取矩形平面的四個頂點。【獲取矩形頂點】
5. 對獲取到的矩形平面進行修剪。【修剪】
以上五步即為建模的演算法流程。下面分別詳細描述每一步:
這裡分割直接採用pcl提供的隨即取樣一致性分割演算法sacsegmentation,分割時需要提供乙個距離閾值,該值不宜太小也不宜太大,倘若太小就造成過度分割,太大會造成分割比較粗糙。這裡經過實驗,該閾值設為0.06效果較好。
分割後就得到若干個點雲平面和對應的平面方程係數。
遍歷第一步分割出來的平面,每次對兩個不同的平面進行比較,如果這兩個平面近似平行,則計算這兩個」平行」平面間的」距離」,若得到的距離小於設定的閾值,那麼就將這兩個平面聚為一類。
其中,判斷兩個平面是否近似平行,有兩種可行辦法。其中一種是計算兩個平面單位法向量間的歐式距離,如果該距離接近於0,則表示平面近似平行;另外一種是計算兩個平面單位法向量間的余弦距離,如果該距離對應的角度小於某個閾值,則表示兩個平面近似平行。本次實驗採用第二種,閾值設為12.5度。
兩個」平行」平面間的」距離」的計算是採用k近鄰演算法,遍歷其中乙個平面的點,對平面的點到另乙個平面的距離進行加權平均,每個點對應的權值是該點周圍半徑為r的圓內點的個數。
將聚類步驟中得到的近似平行的平面族投影到其中乙個平面上,該基準平面的選取標準有兩種,其中一種是點的個數最多的平面,另一種是最接近於垂直於地面的平面。本次實驗比較兩種效果後,決定採用第二種。當然選用第二個標準的前提是建築物垂直於水平地面。
獲取矩形頂點即為獲取平面的最小邊界盒,這裡假設矩形的上面兩個頂點構成的邊平行於水平地面。這裡首先獲取z值最大的點(最高的點)和最小的z值(最低的點),然後獲取兩側最遠的點,通過這兩個點和最高點就可以確定邊界盒矩形。
最初得到的各個平面矩形有可能是相交的,這樣就造成角落出現突出的部分,因此有必要對這些突出部分進行修剪。
修剪演算法就是每次分別對乙個矩形平面的上下兩條邊和乙個點雲平面進行處理,如果邊與點雲平面直接相交且其中乙個端點到點雲平面的距離小於某個閾值,那麼將該端點用交點替換;如果邊的延長線與點雲平面相交且其中乙個端點到點雲平面的距離小於某個閾值,仍然將距點雲平面近的點用交點替換。如果邊與點雲平面相交,但是兩個端點到平面距離大於閾值,那麼有兩種情況:第一種是這條邊確實與點雲平面相交,這種情況就不做處理;第二種是這條邊與點雲平面「偽相交」,這種情況是由於平面聚類分割時將原本不在乙個平面的點聚類到乙個平面上,造成投影後的平面與其他平面相交,這時候就需要從原始點雲中獲取該平面的真實邊界點,如果邊界點與邊的端點相對應,那麼就表示邊與平面正常相交,但如果不對應,那麼就表示「偽相交」,這時就要將重新獲取邊的端點。
在本次試驗中,閾值設定為1.8。
const float epsilon = 1.5;
const float angle_threshold = (m_pi / 180 * 12.5); //!平面間的夾角小於該閾值,可近似看作平行
const float pln2pln_threshold = 1.4;//;1.8; //!兩近似平行平面間的距離小於pln2pln_threshold,就將兩平面融合
const float center2center_threshold = 6.0; //!兩近似平行平面的重心間的距離小於center2center_threshold, 就將兩平面融合
const float pnt2plane_threshold = 1.8; //!點到平面間的閾值,若距離小於該閾值則將該點看作是平面的一部分
const float seg_dist_threshold = 0.06; //!兩近似平行平面的重心間的距離小於center2center_threshold, 就將兩平面融合
const int max_iters = 100; //!平面分割時隨機取樣一致性演算法中的迭代次數
經過上面幾步處理後就可以得到一些」矩形」,我們想要知道處理後的結果如何,就必須通過這些」矩形」重新畫出建築物的點雲模型。
下面先給出原始建築物點雲(0.pcd 2.pcd 3.pcd 4.pcd)的顯示:
經過以上幾步處理的的結果顯示為:
而實物圖為:
主樓前的圓柱形的門柱處理效果很不好就沒有在上面的途中顯示。
本演算法只能用於處理垂直於水平面的牆面,對於圓柱、圓錐等非平面以及不垂直於水平面的平面並不適用。
演算法的幾個步驟相關性比較大,例如平面分割沒有做好,那麼後面的修剪可能就存在問題。
另外,對於不同環境下裝置採集到的點雲,可能需要手動調整下閾值引數,方能得到相應的效果。
以上處理對應的**見
題解 建築物
題目 有r紅色立方體,g綠色立方體和b藍色立方體。每個立方體的邊長是1。現在有乙個n n的木板,該板被劃分成1 1個單元。現在要把所有的r g b個立方體都放在木板上。立方體必須放置在單元格內,單元格可以豎立放置多個立方體。放置在板上的立方體可以被視為 建築物 乙個 建築物 被稱為 美麗建築物 當且...
rust建築物拆除指令 克拉瑪依拆除建築物
鴻運切割拆除工程 為您詳細解讀cmbtwh克拉瑪依拆除建築物的相關知識與詳情,陳某國的石油化學工業鼓起於20世紀60年代,目前擁有大中型石油化工企業100多個,幾乎遍及全國。那些企業每年為供給大量的石油賣得貨 合成纖維 塑料和化肥,以及一些根本化工本料,為陳某國國民經濟的迅速開展和餬口的改善做出了巨...
建築物的輪廓問題
問題描述 描述 對於城市中幾座建築外形,給出這些建築的二維輪廓。關於輸入 輸入的第一行是正整數 n 1 n 100 000 表示建築的數目。接下來 n 行,每行三個正整數start end height,表示建築的左邊界 右邊界和高度。關於輸出 輸出建築群的輪廓,包含多行,從左到右輸出建築的邊界 u...