Open3D KdTree建立、3种近邻搜索及结果可视化
生活随笔
收集整理的這篇文章主要介紹了
Open3D KdTree建立、3种近邻搜索及结果可视化
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 點(diǎn)云索引
Open3D KdTree,可以快速的在無(wú)序的點(diǎn)云中建立空間拓?fù)浣Y(jié)構(gòu),使得能迅速的進(jìn)行近鄰搜索;
2. 近鄰方法分類:
Open3D這邊支持的近鄰搜索方法由VTK實(shí)現(xiàn);
- K近鄰搜索(K Nearest Neighbors Search)
- 半徑近鄰搜索(Radius Nearest Neighbors Search)
- 混合近鄰搜索( RKNN Radius K Nearest Neighbors Search)
3. 索引應(yīng)用
- 點(diǎn)云下采樣
- 點(diǎn)云的高效無(wú)損壓縮 15%
- 基于鄰域關(guān)系的快速查找
4. 效果圖
原始點(diǎn)云
近鄰搜索結(jié)果
k近鄰中心點(diǎn)紅色,K近鄰綠色
半徑近鄰中心點(diǎn)紅色,半徑近鄰藍(lán)色
混合近鄰中心點(diǎn)黃色,混合近鄰點(diǎn)青色
# <Open3D使用FLANN來(lái)構(gòu)建KDTree,以便快速檢索最近的鄰居。>
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
import open3d as o3d
import osdef search_knn_vector_3d(pcd, pcd_tree, k, j):# search_knn_vector_3d K近鄰查詢pcd.colors[20 * j] = [1, 0, 0] # 給定查詢點(diǎn)并渲染為紅色[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[20 * j], k)o3d.np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0] # K鄰域的點(diǎn),渲染為綠色print(idx[1])print(pcd.points[idx[2]])def search_radius_vector_3d(pcd, pcd_tree, k, j, dis):# search_radius_vector_3d 半徑近鄰搜索pcd.colors[150 * j] = [1, 0, 0] # 給定查詢點(diǎn)并渲染為紅色[k1, idx1, _] = pcd_tree.search_radius_vector_3d(pcd.points[150 * j], 2 * dis)o3d.np.asarray(pcd.colors)[idx1[1:], :] = [0, 0, 1] # 半徑搜索結(jié)果并渲染為藍(lán)色def search_hybrid_vector_3d(pcd, pcd_tree, k, j, dis):# 混合搜索(RKNN),它最多返回K個(gè)和查詢點(diǎn)距離小于給定半徑的最鄰近點(diǎn)pcd.colors[200 * j] = [1, 1, 0] # 給定查詢點(diǎn)并渲染為黃色[k2, idx2, _] = pcd_tree.search_hybrid_vector_3d(pcd.points[200 * j], 2 * dis, k)o3d.np.asarray(pcd.colors)[idx2[1:], :] = [0, 1, 0.8] # 半徑搜索結(jié)果并渲染為青色path = os.path.abspath(os.path.join(os.getcwd(), "../"))
path = path + "/pcds/bunny.pcd"
# k:ksearch數(shù)量
# j:第多少個(gè)點(diǎn)*基數(shù)當(dāng)作尋找的點(diǎn)
# dis:半徑search的半徑值基數(shù)
k = 50
j = 1
dis = 0.01
# path = path + "/pcds/1001140020191217_las2pcd_g.pcd"
# j = 150
# k = 20000
# dis = 1
print(path)pcd = o3d.io.read_point_cloud(path)
pcd.paint_uniform_color([0.5, 0.5, 0.5]) # 把所有點(diǎn)渲染為灰色(灰兔子)
print(pcd)
o3d.visualization.draw_geometries([pcd], window_name='Open3D KdTree Origin', width=800, height=600, left=50, top=50,point_show_normal=False, mesh_show_wireframe=False,mesh_show_back_face=False)# 建立KD樹(shù)索引
pcd_tree = o3d.geometry.KDTreeFlann(pcd)search_knn_vector_3d(pcd, pcd_tree, k, j)
search_radius_vector_3d(pcd, pcd_tree, k, j, dis)
search_hybrid_vector_3d(pcd, pcd_tree, k, j, dis)# 可視化
o3d.visualization.draw_geometries([pcd], window_name='Open3D KdTree', width=800, height=600, left=50, top=50,point_show_normal=False, mesh_show_wireframe=False,mesh_show_back_face=False)
總結(jié)
以上是生活随笔為你收集整理的Open3D KdTree建立、3种近邻搜索及结果可视化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 鼋头渚开车可以进去不
- 下一篇: Open3D点云处理算法最全合集