Open3D 點對面的ICP算法配準(精配準)

目錄

一、概述

1.1核心思想

1.2實現步驟

二、代碼實現

2.1關鍵函數

2.2完整代碼

三、實現效果

3.1原始點云

3.2配準后點云

3.3計算數據


一、概述

????????基于點對面的ICP(Iterative Closest Point)配準算法是ICP的一種變體,它通過最小化源點云中每個點到目標點云表面的距離來實現配準。與傳統的點對點ICP算法相比,點對面ICP可以在某些情況下提供更好的配準精度,特別是當目標點云具有復雜的幾何形狀時。

1.1核心思想

點對面ICP配準算法的核心思想是:

  1. 對于源點云中的每個點,找到目標點云中的最近面。
  2. 計算源點到該面的垂直距離。
  3. 通過最小化這些垂直距離來估計剛體變換(旋轉和平移),使源點云與目標點云對齊。

1.2實現步驟

具體步驟如下:

  1. 初始化:選擇一個初始變換(通常是單位變換)將源點云與目標點云進行初步對齊。
  2. 最近面配對:對于源點云中的每個點,找到目標點云中最近的面(通常由三角形網格表示)。這一步通常通過最近鄰搜索來實現。
  3. 計算誤差:計算源點到目標面之間的垂直距離(誤差)。
  4. 最小化誤差:通過最小化這些垂直距離來估計新的剛體變換。
  5. 迭代:應用計算得到的剛體變換,并重復以上步驟,直到誤差收斂或達到最大迭代次數。

二、代碼實現

2.1關鍵函數

1、該類TransformationEstimationPointToPlane()提供用于計算點對面的ICP目標函數的殘差和雅可比矩陣的函數。函數registration_icp將其作為參數并運行點對面的ICP以獲得結果。

2、該函數evaluate_registration計算兩個主要指標。fitness計算重疊區域(內點對應關系/目標點數)。越高越好。inlier_rmse計算所有內在對應關系的均方根誤差RMSE。越低越好。

3、由于函數transformand paint_uniform_color會更改點云,可視化部分調用copy.deepcoy進行復制并保護原始點云。

2.2完整代碼

import copy
import open3d as o3d
import numpy as np
# -------------------讀取點云數據--------------------
source = o3d.io.read_point_cloud("hand.pcd")
target = o3d.io.read_point_cloud("hand_trans.pcd")
# --------------------計算法向量---------------------
source.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))
target.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))
# ----------------可視化點云初始位置-----------------
o3d.visualization.draw_geometries([source, target], width=600, height=600, mesh_show_back_face=False)
threshold = 1 # 距離閾值
trans_init = np.asarray([[ 0.98194534, -0.18295687, -0.04806395,  0.65088957],[ 0.11626176,  0.78413388, -0.60960419,  4.19087836],[ 0.14921985,  0.59300999,  0.79124749,  0.42555584],[ 0,          0,          0,          1        ]])  # 初始變換矩陣,一般由粗配準提供
print("Initial alignment")
evaluation = o3d.pipelines.registration.evaluate_registration(source, target, threshold, trans_init)
print(evaluation)  # 這里輸出的是初始位置的 fitness和RMSE
print("Apply point-to-plane ICP")
icp_p2plane = o3d.pipelines.registration.registration_icp(source, target, threshold, trans_init,o3d.pipelines.registration.TransformationEstimationPointToPlane(),    # 執行點對面的ICP算法o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=30))  # 設置最大迭代次數
print(icp_p2plane)  # 輸出ICP相關信息
print("Transformation is:")
print(icp_p2plane.transformation) # 輸出變換矩陣# -----------------可視化配準結果---------------------
def draw_registration_result(source, target, transformation):source_temp = copy.deepcopy(source)         # 由于函數transformand paint_uniform_color會更改點云,target_temp = copy.deepcopy(target)         # 因此調用copy.deepcoy進行復制并保護原始點云。source_temp.paint_uniform_color([1, 0, 0])  # 點云著色target_temp.paint_uniform_color([0, 1, 0])source_temp.transform(transformation)# o3d.io.write_point_cloud("trans_of_source1.pcd", source_temp)  # 保存點云o3d.visualization.draw_geometries([source_temp, target_temp], width=600, height=600, mesh_show_back_face=False)draw_registration_result(source, target, icp_p2plane.transformation)

三、實現效果

3.1原始點云

3.2配準后點云

3.3計算數據

Initial alignment
RegistrationResult with fitness=1.000000e+00, inlier_rmse=1.838722e-01, and correspondence_set size of 327323
Access transformation to get result.
Apply point-to-plane ICP
RegistrationResult with fitness=1.000000e+00, inlier_rmse=1.660569e-07, and correspondence_set size of 327323
Access transformation to get result.
Transformation is:
[[ 1.00000001e+00  3.24158871e-10  5.54218013e-09 -3.07668001e-08][ 1.41976912e-09  7.07106784e-01 -7.07106783e-01  4.99999999e+00][-7.42239601e-10  7.07106783e-01  7.07106780e-01  1.00000000e+00][ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]]

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

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

相關文章

【Ty CLI】一個開箱即用的前端腳手架

目錄 資源鏈接基礎命令模板創建命令幫助選擇模板開始創建開發模板 開發背景npm 發布流程問題記錄模板創建超時 更新日志 資源鏈接 文檔:https://ty.cli.vrteam.top/ 源碼:https://github.com/bosombaby/ty-cli 基礎命令 1. npm 全局安裝 npm i ty-cli…

Zabbix Sia Zabbix 邏輯漏洞(CVE-2022-23134)

前言 CVE-2022-23134是一個中等嚴重度的漏洞,影響Zabbix Web前端。這個漏洞允許未經身份驗證的用戶訪問setup.php文件的某些步驟,這些步驟通常只對超級管理員開放。利用這個漏洞,攻擊者可以通過跳過某些步驟來重新配置Zabbix前端&#xff0c…

gazebo仿真環境中加入livox mid360

https://github.com/Livox-SDK/livox_laser_simulation 功能包適用于ubuntu18.04 gazebo9的可以直接編譯運行。在ubutun20.04 的系統下gazebo是11版本,需要做一些修改 CMakeLists.txt文件中的 add_compile_options(-std=c++11) 改為 add_compile_options(-std=c++17)fatal er…

二一、搭建自已的語言大模型

1. 配置langchain環境 使用conda創建一個虛擬環境,基于 Python3.10,并在虛擬環境內安裝項目的依賴。注意,大模型對gpu有一定的要求,否則速度會奇慢無比。 conda create -n langchain python=3.10 conda env list conda activate langchain # 拉取倉庫 $ git clone ht…

Redis-Jedis連接池\RedisTemplate\StringRedisTemplate

Redis-Jedis連接池\RedisTemplate\StringRedisTemplate 1. Jedis連接池1.1 通過工具類1.1.1 連接池:JedisConnectionFactory:1.1.2 test:(代碼其實只有連接池那里改變了) 2. SpringDataRedis(lettuce&#…

終于弄明白了什么是EI!

EI是Engineering Index的縮寫,中文意為“工程索引”,是由美國工程信息公司(Engineering Information, Inc.)編輯出版的著名檢索工具。它始創于1884年,擁有超過一個世紀的歷史,是全球工程界最權威的文獻檢索系統之一。EI雖然名為“…

十五、小型電腦沒有數字鍵及insert,怎么解決IDEA快速插入getset構造這些方法

🌻🌻目錄 一、小型電腦沒有數字鍵及insert,怎么解決IDEA快速插入getset構造這些方法 一、小型電腦沒有數字鍵及insert,怎么解決IDEA快速插入getset構造這些方法 解決: 1.winR打開搜索 2.osk回車 屏幕就出現了這樣的一…

CC7利用鏈分析

分析版本 Commons Collections 3.2.1 JDK 8u65 環境配置參考JAVA安全初探(三):CC1鏈全分析 分析過程 CC7,6,5都是在CC1 LazyMap利用鏈(引用)的基礎上。 只是進入到LazyMap鏈的入口鏈不同。 CC7這個鏈有點繞,下面順著分析一下利用鏈。 入口類是Hashtable&…

前端入門知識分享:如何在HTML或CSS文件中引用CSS文件。

閱讀提示:本文僅僅僅適用于剛剛接觸HTML和CSS的小白從業者,新人愛好者。自覺身份不符的老鳥們,盡快繞行吧! 什么是CSS?什么是CSS文件。 CSS,全稱為Cascading Style Sheets(層疊樣式表&#xff…

分布式IO模塊軟件配置

組態接口模塊 1、打開網絡視圖 2、拖拽出ET200SP 3、雙擊ET200SP的圖片,進入從站配置 總線適配器的組態更換 關于IO地址分配,需要建立好子網通信后,在主機上配置。 可以看到IP 和設備名 設備與控制器的Profinet連接 先找到設備名稱再找…

HarmonyOS鴻蒙DevEco Studio無法連接本地模擬器

使用DevEcoStudio 5.0.3.403版本 發現無法選擇模擬器 解決方法: 1、打開模擬器 2、關閉DevEco Studio,(不要關閉模擬器) 3、重新打開DevEco Studio。

EXCEL VBA發郵件,實現自動化批量發送

EXCEL VBA發郵件,實現自動化批量發送 以GET方式上傳數據 Public Function uploadData_GET(ByVal url As String)Dim httpSet http CreateObject("Microsoft.XMLHTTP")http.Open "GET", url, Falsehttp.sendDebug.Print http.getAllResponseHea…

四道經典算法JAVA

1.爬樓地 爬20個臺階的爬法:f(19)f(18) 經典斐波拉契數列問題 public class demo4 {//爬樓梯問題public static void main(String[] args) {System.out.println(getSum(20));}public static int getSum(int n) {if (n 1)return 1;if (n 2)return 2;return getSum(n - 1) …

SpringBoot:SpringBoot中如何實現對Http接口進行監控

一、前言 Spring Boot Actuator是Spring Boot提供的一個模塊,用于監控和管理Spring Boot應用程序的運行時信息。它提供了一組監控端點(endpoints),用于獲取應用程序的健康狀態、性能指標、配置信息等,并支持通過 HTTP …

jdk1.8 ConcurrentHashMap 源碼分析

ConcurrentHashMap 1.8 使用synchronized 和CAS 實現 記住:1.8沒有分段鎖不要混淆了,分段鎖是1.7中的 final V putVal(K key, V value, boolean onlyIfAbsent) {if (key null || value null) throw new NullPointerException();//計算hashint hash…

關于Python的類的一些理解

才發現python的類對象只能調用類方法 我想使用對類對象a使用系統調用的len方法就會報錯 2.類對象a是什么? 答:是所有的帶有self的成員變量 舉例說明:紅色的就是a里面的東西 class A:def __init__(self,data):self.datadataself.b1self.d{a…

發表EI會議論文-對考研生和研究生都有好處!

EI論文對考研和保研的幫助主要體現在以下幾個方面: 對考研的幫助 1.復試加分:在考研過程中,復試階段是關鍵,擁有EI論文可以證明考生具備一定的科研能力,給考官留下深刻印象,有助于提高復試通過率。 2.學…

解讀‘‘不要卷模型,要卷應用‘‘

前言 2024 年 7 月 4 日,世界人工智能大會暨人工智能全球治理高級別會議全體會議在上海世博中心舉行。百度創始人李彥宏在產業發展主論壇上發言,呼吁不要卷模型,要卷應用。 目錄 四個要點 積極的觀點 不合理性 總結 四個要點 李彥宏的呼吁…

多模態:Nougat詳解

文章目錄 前言一、模型結構1. encoder2. decoder3. set 二、數據增強三、數據splitting the pages 四、實驗評估repetitions during inference 五、代碼1. 環境安裝2. Dataset(dataset.py)3. Model(model.py) 總結 前言 科學知識…

一網統管/視頻匯聚/安防監控平臺EasyCVR啟動后無法訪問是什么原因?

智慧城市/一網統管/視頻匯聚/安防監控平臺EasyCVR兼容性強,支持多協議接入,包括國標GB/T 28181協議、GA/T 1400協議、部標JT808協議、RTMP、RTSP/Onvif協議、海康Ehome、海康SDK、大華SDK、華為SDK、宇視SDK、樂橙SDK、螢石云SDK等,并能對外分…