pointcloud
open3d点云坐标表示为Vector3dVector
io
从文件读写点云:
pcd = o3d.io.read_point_cloud(filename="./pcd_example.ply")
o3d.io.write_point_cloud(filename="./pcd_example1.ply", pointcloud=pcd)
http://www.open3d.org/docs/release/python_api/open3d.io.read_point_cloud.html#open3d-io-read-point-cloud
http://www.open3d.org/docs/release/python_api/open3d.io.write_point_cloud.html
点云平移
import numpy as np
import copy
pcd.paint_uniform_color([1,0,0])
trans_matx=np.eye(4)
# 沿x轴平移50
trans_matx[0][3]=50
pcd_move_x = copy.deepcopy(pcd)
pcd_move_x .transform(trans_matx)
pcd_move_x.paint_uniform_color([0, 1, 0])
o3d.visualization.draw_geometries([pcd,pcd_move_x],
window_name='open3d',
width=960, height=900, left=960, top=100)
visualization
点云上色:
# red[1,0,0],green[0,1,0],blue[0,0,1]
pcd.paint_uniform_color([1,0,0])
http://www.open3d.org/docs/release/python_api/open3d.geometry.PointCloud.html#open3d.geometry.PointCloud.paint_uniform_color
可视化:
假设有两个点云:pcd1 pcd2要显示
o3d.visualization.draw_geometries([pcd1,pcd2],
window_name='open3d',
width=960, height=900, left=960, top=100)
点云部分上色
# 先将点云colors转成npy(首先要保证点云是有颜色信息的)
color_npy = np.array(pcd_plane.colors)
# 将部分点的颜色改变,idx_点的索引
color_npy[idx_] = [1, 1, 0]
pcd_plane.colors = o3d.utility.Vector3dVector(color_npy)
点云平面分割
open3d demo:
http://www.open3d.org/docs/release/tutorial/geometry/pointcloud.html#Plane-segmentation
distance_threshold是阈值,在此阈值之内的点才是平面点
ransac_n是ransac算法选点的个数,3个点就能确定一个平面,ransac_n越大,拟合的平面就越严格
num_iterations是ransac迭代次数
coefficients是4x1的平面系数
plane_idx是平面点的索引,用于筛选出平面点
想搞明白的话看看open3d的源码以及ransac算法
open3d source code for plane segment :
https://github.com/isl-org/Open3D/blob/master/cpp/open3d/geometry/PointCloudSegmentation.cpp#L135
pcd.paint_uniform_color([1,0,0])
coefficients, plane_idx = pcd.segment_plane(distance_threshold=0.2, ransac_n=10, num_iterations=500)
color_npy = np.array(pcd.colors)
# 将平面部分单独上色
color_npy[plane_idx ] = [1, 1, 0]
pcd_plane.colors = o3d.utility.Vector3dVector(color_npy)
o3d.visualization.draw_geometries([pcd],
window_name='open3d',
width=960, height=900, left=960, top=100)
# 也可将平面点云单独提取
pcd_plane=pcd.select_by_index(plane_idx)
完
--------------------------------------------------------------------------------------------诺有缸的高飞鸟202111