pclpy 點云法線

pclpy 點云法線

      • 一、算法原理
          • 1.理論入門
          • 2.選擇正確的比例
      • 二、代碼
      • 三、結果
      • 四、相關數據

一、算法原理

表面法線是幾何表面的重要屬性,在許多領域(例如計算機圖形應用程序)中大量使用,以應用正確的光源來生成陰影和其他視覺效果。

給定一個幾何表面,通常很容易將表面上某個點的法線方向推斷為垂直于該點表面的向量。但是,由于我們獲取的點云數據集代表了真實表面上的一組點樣本,因此有兩種可能性:

  • 從獲取的點云數據集中獲取底層表面,使用表面網格劃分技術,然后從網格計算表面法線;
  • 使用近似值直接從點云數據集推斷表面法線。
1.理論入門

盡管存在許多不同的法線估計方法,但我們將在本教程中重點介紹的方法是最簡單的方法之一,其公式如下。確定表面上一點的法線的問題近似于估計與表面相切的平面的法線的問題,這反過來又變成了最小二乘平面擬合估計問題。

有關更多信息,包括最小二乘問題的數學方程,請參閱pclpy 最小二乘法擬合平面-CSDN博客。

因此,用于估計表面法線的解決方案簡化為對從查詢點的最近鄰居創建的協方差矩陣的特征向量和特征值(或 PCA – 主成分分析)進行分析。更具體地說,對于每個點pi,我們C按如下方式組裝協方差矩陣:
在這里插入圖片描述

為考慮點鄰居的數目在附近 pi,p 表示3D質心最近的鄰居,入j是 j)協方差矩陣的特征值第,并且vj 在j個特征向量。

一般來說,因為沒有數學方法來求解法線的符號,如上所示通過主成分分析 (PCA) 計算的方向是不明確的,并且在整個點云數據集上的方向不一致。下圖展示了這些對代表廚房環境一部分的較大數據集的兩個部分的影響。圖的右半部分表示擴展高斯圖像 (EGI),也稱為法線球體,它描述了點云中所有法線的方向。由于數據集是 2.5D,因此是從單個視點獲取的,因此法線應僅出現在 EGI 球體的一半上。然而,由于方向不一致,它們遍布整個球體。

在這里插入圖片描述

如果觀點vp 實際上是已知的,那么這個問題的解決方案是微不足道的。為了使所有法線ni 一致地朝向視點,它們需要滿足等式:

在這里插入圖片描述

下圖顯示了上圖數據集中的所有法線一致指向視點后的結果。

在這里插入圖片描述

2.選擇正確的比例

如前所述,一個點的表面法線需要從該點的周圍點鄰域支持(也稱為k-neighborhood)估計 。

最近鄰估計問題的細節提出了正確比例因子的問題:給定采樣點云數據集,正確的k(通過pcl::Feature::setKSearch給出)或r(通過pcl::Feature給出)是多少 ::setRadiusSearch ) 值應該用于確定一個點的最近鄰居集?

這個問題非常重要并且構成了點特征表示的自動估計(即,沒有用戶給定閾值)的限制因素。為了更好地說明這個問題,下圖展示了選擇較小尺度(即較小的rk)與較大尺度(即較大的rk )的效果)。圖中的左側部分描繪了一個合理的精心選擇的比例因子,兩個平面的估計表面法線近似垂直,整個桌子上都可以看到小邊緣。然而,如果比例因子太大(右側部分),因此相鄰表面的鄰居集合更大,覆蓋來自相鄰表面的點,則估計的點特征表示會失真,在兩個平面的邊緣處具有旋轉的表面法線,并被涂抹邊緣和抑制細節。

在這里插入圖片描述

無需涉及太多細節,現在假設必須根據應用程序所需的詳細程度來選擇確定點鄰域的尺度就足夠了。簡而言之,如果杯子手柄和圓柱部分之間邊緣的曲率很重要,則比例因子需要足夠小以捕捉這些細節,否則就大。

二、代碼

from pclpy import pclif __name__ == '__main__':# 加載點云cloud = pcl.PointCloud.PointXYZ()reader = pcl.io.PCDReader()reader.read("res/bunny.pcd", cloud)print(cloud.size())  # 打印點云的數目# 構造法線估計類ne = pcl.features.NormalEstimation.PointXYZ_Normal()  # 法線對象ne.setInputCloud(cloud)  # 將cloud放入到ne中tree = pcl.search.KdTree.PointXYZ()  # 建立kd搜索樹ne.setSearchMethod(tree)cloud_normals = pcl.PointCloud.Normal() ne.setRadiusSearch(0.03)  # 設置半徑搜索領域0。03m# 計算法線ne.compute(cloud_normals)  # 計算法線print(cloud_normals.size())  # 打印法線的數目

三、結果

[output]
點云數目: 35947
法線數目: 35947

四、相關數據

法線估計官網:Normal Estimation Using Integral Images — Point Cloud Library 0.0 documentation (pcl.readthedocs.io)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713129.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713129.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713129.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

緩存穿透--一起學習吧之架構

緩存穿透是指查詢一個一定不存在的數據,由于緩存是不命中時需要從數據庫查詢,查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到數據庫去查詢,進而給數據庫帶來壓力。在高并發場景下,如果某個key被高并發…

Android 混淆是啥玩意兒?

什么是混淆 Android混淆,是伴隨著Android系統的流行而產生的一種Android APP保護技術,用于保護APP不被破解和逆向分析。簡單的說,就是將原本正常的項目文件,對其類、方法、字段,重新命名a,b,c…之類的字母&#xff0c…

森林滅火利器|便攜式森林消防滅火泵|恒峰智慧科技

隨著人們對環境保護意識的不斷提高,森林防火工作顯得尤為重要。然而,傳統的森林滅火方式存在諸多不便,如火勢蔓延迅速、滅火效率低下等。為了更好地保護森林資源,科學家們研發出了一種便攜式森林消防滅火泵,它的出現為…

利用css實現常見圖形

1、正圓形 給正方形盒子設置圓角屬性為寬高的50%。 div {width: 100px;height: 100px;background-color: plum;border-radius: 50%; } 2、膠囊形 給長方形盒子設置圓角屬性為盒子高度的50%。 div {width: 200px;height: 100px;background-color: plum;border-radius: 50px…

基于C#開發OPC DA客戶端——基于OPCDAAuto

OPC DA OPC DA(OPC Data Access),即OPC數據訪問接口,定義了數據交換的規范,包括:過程值、更新時間、數據品質等信息。 自動化接口中共定義了6類對象:OPCServer對象、OPCBrowser對象、OPCGroups對象、OPCGroup對象、O…

steloj勒索病毒:[steloj@mailfence.com].steloj襲擊了您的計算機?

引言: 在數字時代,我們的數據是我們最寶貴的資產之一。然而,隨著科技的進步,網絡犯罪也在不斷演變。最新的威脅之一就是.[stelojmailfence.com].steloj勒索病毒。這種惡意軟件不僅能夠加密你的數據,而且還會要求贖金以…

C++11之字符串與數值之間的轉換

C11之字符串與數值之間的轉換 數值轉換為字符串字符串轉換為數值 在C11中提供了專門的類型轉換函數,程序猿可以非常方便的使用它們進行數值類型和字符串類型之間的轉換。 數值轉換為字符串 使用to_string()方法可以非常方便地將各種數值類型轉換為字符串類型&#…

如何做代幣分析:以 SHIB 幣為例

作者:lesleyfootprint.network 編譯:cicifootprint.network 數據源:SHIB Token Dashboard (僅包括以太坊數據) 在加密貨幣和數字資產領域,代幣分析起著至關重要的作用。代幣分析指的是深入研究與代幣相關…

貪心算法 —— 字典序刪除字符

題目描述 給定一個單詞,請問在單詞刪除t個字母之后,能得到的字典序最小的單詞是什么? 輸入描述 輸入的第一行包含一個單詞,有大寫英文字母組成 第二行包含一個正整數t 其中,單詞長度不超過100,t小于單…

qt學習:串口調試助手

目錄 步驟 配置ui界面 注意 新建一個自定義復選框類MyComboBox,并繼承自帶的復選框類 重寫一個鼠標左鍵按下事件,按下就發送信號 定義一個信號 本身ui界面類.h 添加頭函數 定義成員數據和成員函數(槽函數) 本身ui界面類.cpp 構造函數 發送數據槽函數 接收數據…

3、Redis-List【常用】

目錄 一、重要特點 二、常用命令 三、Redis中List類型應用場景 一、重要特點 ①Redis中的List,視為雙向鏈表 ②Redis中的List,數據可以重復 二、常用命令 常用命令 格式含義例子rpush key value從右邊往key中添加value值rpush hobby java pythonlpu…

保姆教程 Docker 部署微服務項目

大家好,我是奇兵。 文章比較長,請耐心看完! 項目上線是每位學編程同學必須掌握的基本技能。之前我已經給大家分享過很多種上線單體項目的方法了,今天再出一期微服務項目的部署教程,用一種最簡單的方法,帶…

備戰藍橋杯Day18 - 雙鏈表

一、每日一題 藍橋杯真題之工作時長 這個題寫代碼做的話很麻煩,而且我也不一定能寫出來,所以我直接就是用的excel來計算的時間和。 使用excel的做法 1.先把文件中的時間復制到excel中。 2.把日期和時間分到兩列。 分成兩列的步驟: 選中要…

基于單片機的節能窗控制系統設計

摘 要:本文以單片機為基礎,對節能窗控制系統進行了科學設計,在滿足日常生活需求的同時更好地實現節能減排目標。此設計中的節能窗控制系統,實際操作要靈活,具備可靠且穩定的性能,同時具備節能功效。 關鍵詞:單片機;節能窗控制系統;系統設計 在節能窗等概念推廣的背景…

css實現一行靠右,多行靠左

利用 inline-block 可以根據內容寬度變化的特性 如果內容多到折行了&#xff0c;那自身的寬度會和父級同寬&#xff0c;同寬后&#xff0c;產生折行&#xff0c;這時候就生效了… <!DOCTYPE html> <html lang"en"> <head><meta charset"U…

Atcoder ABC342 E - Last Train

Last Train&#xff08;最后一班火車&#xff09; 時間限制&#xff1a;2s 內存限制&#xff1a;1024MB 【原題地址】 所有圖片源自Atcoder&#xff0c;題目譯文源自腳本Atcoder Better! 點擊此處跳轉至原題 【問題描述】 【輸入格式】 【輸出格式】 【樣例1】 【樣例輸入…

2. this 指向問題

this 指向問題 前言 當一個函數調用時&#xff0c;會創建一個執行上下文&#xff0c;這個上下文包括函數調用的一些信息(調用棧&#xff0c;傳入參數&#xff0c;調用方式)&#xff0c;this就指向這個執行上下文。 this 不是靜態的&#xff0c;也并不是在編寫的時候綁定的&am…

java-類和對象-構造方法

類: 屬性 和 方法1. 屬性 與 變量 的 區別屬性 位于 類中 ,變量 位于方法中,2. void 與 returnvoid 無返回值類型return 返回XXXx, return 意味著 方法 執行 結束,return 后面表達式的數據類型必須與方法的返回值類型 一致訪問修飾符 返回值類型 方法名(){}3. 方法的調…

Linux筆記-1

概述 簡介 Linux是現在服務器上最常用的操作系統(OS - Operating system) - 所謂的操作系統本質上也是一個軟件&#xff0c;是一個可以運行其他軟件的容器如果一臺服務器&#xff0c;沒有安裝操作系統&#xff0c;此時稱之為裸機。裸機可以使用&#xff0c;在使用的時候需要使…

【MQ06】延時隊列與優先級隊列

延時隊列與優先級隊列 在消息隊列的最后一篇文章中&#xff0c;我們再來學習兩個非常常見的隊列功能。一個是延時隊列&#xff0c;一個是優先級隊列。它們的應用場景非常多&#xff0c;也非常有意思&#xff0c;不同的消息隊列工具都提供了不同的實現&#xff0c;同樣的&#x…