Open3D KDtree的建立與使用

目錄

一、概述

1.1kd樹原理

1.2kd樹搜索原理

1.3kd樹構建示例

二、常見的領域搜索方式

2.1K近鄰搜索(K-Nearest Neighbors, KNN Search)

2.2半徑搜索(Radius Search)

2.3混合搜索(Hybrid Search)

三、代碼實現

3.1關鍵函數

3.1.1K近鄰搜索

3.1.2半徑鄰域搜索

3.1.3混合搜索

3.2完整代碼

四、實現效果


一、概述

1.1kd樹原理

????????KD樹(K-Dimensional Tree)是一種用于組織k維空間數據的樹狀數據結構,特別適用于多維空間中的最近鄰搜索和范圍搜索KD樹通過遞歸地將空間劃分為較小的子空間,從而實現高效的空間查詢。

KD樹的構建原理:

  1. 選擇分割維度從數據集中選擇一個維度進行分割。通常選擇當前維度上的方差最大的維度,以最大化分割的效果。這可以幫助平衡樹的結構。
  2. 選擇分割點:在選擇的分割維度上選擇中位數作為分割點。中位數確保每次分割后,兩個子空間包含的點數大致相等,從而保持樹的平衡。
  3. 遞歸構建子樹:對于每個子集,遞歸地選擇新的分割維度和分割點,直到達到某個終止條件,例如節點包含的點數小于某個閾值或樹的深度達到預定值。

1.2kd樹搜索原理

1.最近鄰搜索:

  • 從根節點開始,根據查詢點在當前分割維度上的值,遞歸地搜索子樹,直到到達葉節點。
  • 在回溯過程中,檢查當前節點是否比已知的最近鄰更近,如果是,則更新最近鄰。
  • 還需檢查當前節點的另一子樹是否可能包含更近的點,如果可能,則進行搜索。

2.范圍搜索:

  • 類似于最近鄰搜索,通過比較查詢點與分割點的關系,遞歸地搜索子樹,檢查節點是否在查詢范圍內。


1.3kd樹構建示例

我們將使用以下點構建一個KD樹:

A(2,3), B(5,4), C(9,6), D(4,7), E(8,1), F(7,2)

第一層:

  • 選擇 x 軸進行分割。
  • 選擇 x 軸上的中位數作為分割點,這里是點 D(4,7)。
                D(4,7)/      \

第二層:

  • 對于左子樹,選擇 y 軸進行分割。
  • 左子樹的點為 A(2,3) 和 B(5,4),選擇 y 軸上的中位數點 A(2,3) 作為分割點。
  • 對于右子樹,選擇 y 軸進行分割。
  • 右子樹的點為 C(9,6), E(8,1) 和 F(7,2),選擇 y 軸上的中位數點 F(7,2) 作為分割點。
                D(4,7)/      \A(2,3)     F(7,2)\       /    \B(5,4) E(8,1) C(9,6)

第三層:

  • 對于左子樹的右子樹,選擇 x 軸分割。
  • 對于右子樹的左右子樹,選擇 x 軸分割。

最終構建的KD樹結構如下:

                D(4,7)/      \A(2,3)     F(7,2)\       /    \B(5,4) E(8,1) C(9,6)

二、常見的領域搜索方式

2.1K近鄰搜索(K-Nearest Neighbors, KNN Search)

K近鄰搜索是找到離查詢點最近的K個點的一種方法。K近鄰搜索基于歐幾里得距離度量,通過KD樹可以高效地實現。

過程:

  • 從根節點開始,根據查詢點在當前分割維度上的值,遞歸地搜索子樹,直到到達葉節點。
  • 在回溯過程中,檢查當前節點是否比已知的K個最近鄰點更近,如果是,則更新最近鄰集合。
  • 還需檢查當前節點的另一子樹是否可能包含更近的點,如果可能,則進行搜索。

應用:

  • 數據分類:KNN算法在分類問題中廣泛應用,通過查找最近的K個鄰居進行多數投票決定分類結果。
  • 數據降噪:可以通過找到每個點的K個最近鄰來平滑數據。

2.2半徑搜索(Radius Search)

半徑搜索是找到所有在查詢點某個給定半徑范圍內的點的一種方法。與K近鄰搜索不同,半徑搜索返回的是所有在指定半徑范圍內的點。

過程:

  • 從根節點開始,根據查詢點和分割點之間的距離,遞歸地搜索子樹。
  • 檢查當前節點是否在查詢點的半徑范圍內,如果是,則將其加入結果集合。
  • 檢查當前節點的另一子樹是否可能包含在半徑范圍內的點,如果可能,則進行搜索。

應用:

  • 密度估計:通過找到某個區域內的所有點,可以估計該區域的點云密度。
  • 空間聚類:在聚類算法中,半徑搜索用于找到每個點的鄰域,從而進行聚類。

2.3混合搜索(Hybrid Search)

混合搜索結合了K近鄰搜索和半徑搜索的特點,在進行K近鄰搜索的同時,還限制了搜索范圍在一個給定的半徑內。也就是說,它在指定半徑范圍內找到最多K個最近的點。

過程:

  • 從根節點開始,根據查詢點在當前分割維度上的值和半徑約束,遞歸地搜索子樹,直到到達葉節點。
  • 檢查當前節點是否在查詢點的半徑范圍內,并且是否屬于最近的K個點,如果是,則將其加入結果集合。
  • 檢查當前節點的另一子樹是否可能包含在半徑范圍內并且屬于最近的K個點,如果可能,則進行搜索。

應用:

  • 提高搜索效率:在處理大規模點云數據時,混合搜索可以限制搜索范圍,從而提高搜索效率。
  • 平衡搜索結果:混合搜索可以在保證結果精確度的同時,限制搜索范圍,避免返回過多不相關的點。

三、代碼實現

3.1關鍵函數

3.1.1K近鄰搜索

??search_knn_vector_3d返回查詢點的k個最近鄰的索引列表。這些相鄰的點存儲在數組numpy中,使用pcd.colors對numpy數組內所有的點進行顏色渲染(渲染為綠色[0,1,0])。這里跳過了第一個索引點,因為它是查詢點本身

#K近鄰搜索
pcd.colors[10000] = [1, 0, 0]#給定查詢點并渲染為紅色
[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[10000], 200)#K近鄰搜索
np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0]#K鄰域的點,渲染為綠色

3.1.2半徑鄰域搜索

??使用?search_radius_vector_3d查詢所有的和查詢點點距離小于給定半徑的點

#半徑搜索
pcd.colors[5000] = [1, 0, 0]#給定查詢點并渲染為紅色
[k1, idx1, _] = pcd_tree.search_radius_vector_3d(pcd.points[5000], 0.02)#半徑搜索
np.asarray(pcd.colors)[idx1[1:], :] = [0, 0, 1]#半徑搜索結果并渲染為藍色

3.1.3混合搜索

除了KNN搜索(search_knn_vector_3d)和RNN搜索(search_radius_vector_3d)以外,Open3d還提供了混合搜索函數(search_hybrid_vector_3d)。它最多返回K個和查詢點距離小于給定半徑的最鄰近點。這個函數結合了KNN和RNN的搜索條件,在某些文獻中也被稱作RKNN搜索。在許多情況下它有著性能優勢,并且在Open3d的函數中大量的使用.

#混合搜索
pcd.colors[30000] = [1, 1, 0]#給定查詢點并渲染為黃色
[k2, idx2, _] = pcd_tree.search_hybrid_vector_3d(pcd.points[30000], 0.05,200)#K近鄰搜索
np.asarray(pcd.colors)[idx2[1:], :] = [0, 1, 0.8]#半徑搜索結果并渲染為青色

3.2完整代碼

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("Horse.pcd")
pcd.paint_uniform_color([0.5, 0.5, 0.5])#把所有點渲染為灰色
pcd_tree = o3d.geometry.KDTreeFlann(pcd)#建立KD樹索引#K近鄰搜索
pcd.colors[10000] = [1, 0, 0]#給定查詢點并渲染為紅色[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[10000], 200)#K近鄰搜索
np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0]#K鄰域的點,渲染為綠色#半徑搜索
pcd.colors[5000] = [1, 0, 0]#給定查詢點并渲染為紅色
[k1, idx1, _] = pcd_tree.search_radius_vector_3d(pcd.points[5000], 0.02)#半徑搜索
np.asarray(pcd.colors)[idx1[1:], :] = [0, 0, 1]#半徑搜索結果并渲染為藍色#混合搜索
pcd.colors[30000] = [1, 1, 0]#給定查詢點并渲染為黃色
[k2, idx2, _] = pcd_tree.search_hybrid_vector_3d(pcd.points[30000], 0.05,200)#K近鄰搜索
np.asarray(pcd.colors)[idx2[1:], :] = [0, 1, 0.8]#半徑搜索結果并渲染為青色
o3d.visualization.draw_geometries([pcd])

四、實現效果

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

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

相關文章

ai native 模型微調

AI native 模型微調(fine-tuning)是指在預訓練模型的基礎上,通過對其參數進行進一步訓練,使其在特定任務上表現更佳。以下是關于模型微調的一些基本步驟和概念: ### 1. 準備數據集 - **數據收集**:收集適用…

后端之路——登錄校驗前言(Cookie\ Session\ JWT令牌)

前言:Servlet 【登錄校驗】這個功能技術的基礎是【會話技術】,那么在講【會話技術】的時候必然要談到【Cookie】和【Session】這兩個東西,那么在這之前必須要先講一下一個很重要但是很多人都會忽略的一個知識點:【Servlet】 什么是…

Oracle PL/SQL 循環批量執行存儲過程

1. 查詢存儲過程 根據數據字典USER_OBJECTS查詢出所有存儲過程。 2. 動態拼接字符串(參數等) 根據數據字典USER_ARGUMENTS動態拼接參數。 3. 動態執行 利用EXECUTE IMMEDIATE動態執行無名塊。 4. 輸出執行信息 利用DBMS_OUTPUT.PUT_LINE輸出執行成功與…

Android Gradle 開發與應用 (十): Gradle 腳本最佳實踐

目錄 1. 使用Gradle Kotlin DSL 1.1 什么是Gradle Kotlin DSL 1.2 遷移到Kotlin DSL 1.3 優勢分析 2. 優化依賴管理 2.1 使用依賴版本管理文件 2.2 使用依賴分組 3. 合理使用Gradle插件 3.1 官方插件和自定義插件 3.2 插件管理的最佳實踐 4. 任務配置優化 4.1 使用…

Oracle 19c 統一審計表清理

zabbix 收到SYSAUX表空間告警超過90%告警,最后面給出的清理方法只適合ORACLE 統一審計表的清理,傳統審計表的清理SYS.AUD$不適合,請注意。 SQL> Col tablespace_name for a30 Col used_pct for a10 Set line 120 pages 120 select total.…

STM32實戰篇:閃燈 × 流水燈 × 蜂鳴器

IO引腳初始化 即開展某項活動之前所做的準備工作,對于一個IO引腳來說,在使用它之前必須要做一些參數配置(例如:選擇工作模式、速率)的工作(即IO引腳的初始化)。 IO引腳初始化流程 1、使能IO引…

LED燈的呼吸功能

"呼吸功能"通常是指 LED 燈的一種工作模式,它模擬人類的呼吸節奏,即 LED 燈的亮度會周期性地逐漸增強然后逐漸減弱,給人一種 LED 在"呼吸"的感覺。這種效果通常用于指示設備的狀態或者簡單地作為裝飾效果。(就…

Spring Boot Security自定義AuthenticationProvider

以下是一個簡單的示例,展示如何使用AuthenticationProvider自定義身份驗證。首先,創建一個繼承自標準AuthenticationProvider的類,并實現authenticate方法。 import com.kamier.security.web.service.MyUser; import org.springframework.se…

【Adobe】Photoshop圖層的使用

Adobe Photoshop(簡稱PS)中的圖層是圖像處理中一個核心概念,它允許用戶以堆疊的方式組織圖像的不同部分,從而實現對圖像的復雜編輯和處理而不影響原始圖像。以下是關于Adobe Photoshop圖層的詳細介紹: 一、圖層的定義 圖層就像是透明的紙張,你可以在上面繪制、添加圖像…

YOLOv10改進 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余種損失函數

一、本文介紹 這篇文章介紹了YOLOv10的重大改進,特別是在損失函數方面的創新。它不僅包括了多種IoU損失函數的改進和變體,如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU,還融合了“Focus”思想,創造了一系列新的損失函數。這些組合形式的…

Android Init Language自學筆記

Android Init Language由五個元素組成:Acttions、Commands、Services、Options和Imports。 Actions和Services隱式聲明了一個新的section。所以的Commands和Options都屬于最近聲明的section。 Services具有唯一的名稱,如果重名會報錯。 Actions Acti…

解決Spring Boot中的高可用性設計

解決Spring Boot中的高可用性設計 大家好,我是微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 1. 高可用性設計概述 1.1 什么是高可用性? 高可用性指系統在面對各種故障和異常情況時,仍…

獨立開發者系列(22)——API調試工具apifox的使用

接口的邏輯已經實現,需要對外發布接口,而發布接口的時候,我們需要能自己簡單調試接口。當然,其實自己也可以寫簡單的代碼調試自己的接口,因為其實就是簡單的request請求或者curl庫讀取,調整請求方式get或者…

如果MySQL出現 “Too many connections“ 錯誤,該如何解決?

當你想要連接MySQL時出現"Too many connections" 報錯的情況下,該如何解決才能如愿以償呢?都是哥們兒,就教你兩招吧! 1.不想重啟數據庫的情況下 你可以嘗試采取以下方法來解決: 增加連接數限制&#xff1a…

RxJava學習記錄

文章目錄 1. 總覽1.1 基本原理1.2 導入包和依賴 2. 操作符2.1 創建操作符2.2 轉換操作符2.3 組合操作符2.4 功能操作符 1. 總覽 1.1 基本原理 參考文獻 構建流:每一步操作都會生成一個新的Observable節點(沒錯,包括ObserveOn和SubscribeOn線程變換操作…

asp.netWebForm(.netFramework) CSRF漏洞

asp.netWebForm(.netFramework) CSRF漏洞 CSRF(Cross-Site Request Forgery)跨站請求偽造是一種常見的 Web 應用程序安全漏 洞,攻擊者通過誘使已認證用戶在受信任的網站上執行惡意操作,從而利用用戶的身份 執行未經授權的操作。攻…

echarts實現3D餅圖

先看下最終效果 實現思路 使用echarts-gl的曲面圖&#xff08;surface&#xff09;類型 通過parametric繪制曲面參數實現3D效果 代碼實現 <template><div id"surfacePie"></div> </template> <script setup>import {onMounted} fro…

簡單的找到自己需要的flutter ui 模板

簡單的找到自己需要的flutter ui 模板 網站 https://flutterawesome.com/ 簡介 我原本以為會很難用 實際上不錯 很簡單 打開后界面類似于,右上角可以搜索 點擊view github 相當簡單 很oks

RabbitMq,通過prefetchCount限制消費并發數

1.問題:項目瓶頸,通過rabbitMq來異步上傳圖片,由于并發上傳的圖片過多導致阿里OSS異常, 解決方法:通過prefetchCount限制圖片上傳OSS的并發數量 2.定義消費者 Component AllArgsConstructor Slf4j public class ReceiveFaceImageEvent {private final UPloadService uploadSe…

【見刊通知】MVIPIT 2023機器視覺、圖像處理與影像技術國際會議

MVIPIT 2023&#xff1a;https://ieeexplore.ieee.org/xpl/conhome/10578343/proceeding 入庫Ei數據庫需等20-50天左右 第二屆會議征稿啟動&#xff08;MVIPIT 2024&#xff09; The 2nd International Conference on Machine Vision, Image Processing & Imaging Techn…