基础点云学习:点云上色、大小改变、窗口背景改变、绘制常用类型图形
一、点云上色
1.1 直接上色
pcd.paint_uniform_color([0, 0, 1.0]) # 渲染颜色
参数介绍
color:颜色值,可以是包含三个浮点数的列表或元组,表示 RGB 颜色空间中的颜色。数值类型为float64,每个值的范围是 [0, 1], 若用户输入的值越界则被截断。
结果展示
1.2 延轴点云渲染
cloud = o3d.io.read_point_cloud("点云文件")
pts = np.asarray(cloud.points) # 点云转换为ndarray
# 改变轴
axis = 2 # x轴 0 y轴 1 z轴2 后期会讲解只是有关数组的
# 平分程度
avg = 2
# 根据高度生成色彩
colors = np.zeros([pts.shape[0], 3]) # 生成一个空的与点云相同大小的ndarray
height_max = np.max(pts[:, axis]) # z轴最大
height_min = np.min(pts[:, axis]) # z轴最小
delta_c = abs(height_max - height_min) / (255*avg)
for j in range(pts.shape[0]):
color_n = (pts[j, axis] - height_min) / delta_c
if color_n <= 255:
colors[j, :] = [0, 1 - color_n / 255, 1]
else:
colors[j, :] = [(color_n - 255) / 255, 0, 1]
cloud.colors = o3d.utility.Vector3dVector(colors) # 给点云颜色
o3d.visualization.draw_geometries([cloud]) # 可视化
参数介绍
axis = 2 ,x轴:0 y轴:1 z轴:2 后期会讲解只是有关numpy数组的。avg=2,决定颜色的占比,可自行尝试。
结果展示
二、窗口背景颜色、点云大小
2.1 可视化窗口背景颜色调整
pcd = o3d.io.read_point_cloud('点云路径')
vis = o3d.visualization.Visualizer()
vis.create_window() # 创建窗口
render_option = vis.get_render_option() # 设置点云渲染参数
render_option.background_color = [0, 0, 0] # 设置背景色(这里为黑色)(RGB RGB 颜色空间中的颜色)
vis.add_geometry(pcd) # 添加点云
vis.run()
background_color
参数调整
color:颜色值,可以是包含三个浮点数的列表或元组,表示 RGB 颜色空间中的颜色。数值类型为float64,每个值的范围是 [0, 1], 若用户输入的值越界则被截断。
可视化窗口颜色改变
2.2 点云大小调整
2.2.1 open3d代码调整点云大小
pcd = o3d.io.read_point_cloud('点云路径')
vis = o3d.visualization.Visualizer()
vis.create_window() # 创建窗口
render_option = vis.get_render_option() # 设置点云渲染参数
print(type(render_option))
render_option.point_size = 10 # 设置渲染点的大小(范围并没有具体数据)
vis.add_geometry(pcd) # 添加点云
vis.run()
point_size
参数调整
在 Open3D 中,point_size
的默认值是 1,表示点的直径为 1 个像素。你可以根据需要调整这个值,通常可以设置为任何大于 0 的整数或浮点数。较大的值将使点更大,较小的值将使点更小。例如,你可以尝试设置 point_size
为 2、3、4 等以获得更大的点。
2.2.2 open3d窗口调整点云大小
open3d窗口中,通过键盘上的+
、-
,可以调整点的大小。
结果展示
**注意:**使用 原始点云.point_size = 2
是错误的, Open3D 中,PointCloud 类并没有名为 point_size
的属性。o3d.visualization.draw_geometries([点云], point_size=2)
也是错误的。
三、绘制常用类型——圆锥、圆柱、长方体、球形、箭头、坐标轴和线条(了解)
绘制圆锥
用o3d.geometry.TriangleMesh.create_cone
来绘制圆锥,radius控制其半径,height控制其高度。
import open3d as o3d
cone = o3d.geometry.TriangleMesh.create_cone(radius=1.0,
height=2.0,
resolution=20,
split=1)
cone.compute_vertex_normals()
cone.paint_uniform_color([0, 1, 0])
o3d.visualization.draw_geometries([cone])
绘制圆柱
用o3d.geometry.TriangleMesh.create_cylinder
绘制圆柱,radius控制圆柱半径,height控制圆柱的高。
import open3d as o3d
mesh_cylinder = o3d.geometry.TriangleMesh.create_cylinder(radius=0.3,
height=4.0)
mesh_cylinder.compute_vertex_normals()
mesh_cylinder.paint_uniform_color([0.1, 0.4, 0.1])
o3d.visualization.draw_geometries([mesh_cylinder])
绘制长方体
用o3d.geometry.TriangleMesh.create_box
绘制长方体,width,height,depth对应长方体长、宽和高度。
import open3d as o3d
mesh_box = o3d.geometry.TriangleMesh.create_box(width=2.0,
height=1.0,
depth=1.0)
mesh_box.compute_vertex_normals()
mesh_box.paint_uniform_color([0.9, 0.1, 0.1])
o3d.visualization.draw_geometries([mesh_box])
绘制球形
用o3d.geometry.TriangleMesh.create_sphere
绘制球体,radius控制球的半径,resolution控制图形显示的分辨率,如果不设定分配率的话,默认值为20。
import open3d as o3d
mesh_sphere = o3d.geometry.TriangleMesh.create_sphere(radius=1.0,
resolution=100)
mesh_sphere.compute_vertex_normals()
mesh_sphere.paint_uniform_color([0.1, 0.1, 0.7])
o3d.visualization.draw_geometries([mesh_sphere])
绘制箭头
用o3d.geometry.TriangleMesh.create_arrow
绘制箭头。
import open3d as o3d
arrow = o3d.geometry.TriangleMesh.create_arrow(cylinder_radius=1.0,
cone_radius=1.5,
cylinder_height=5.0,
cone_height=4.0,
resolution=20,
cylinder_split=4,
cone_split=1)
arrow.compute_vertex_normals()
arrow.paint_uniform_color([1, 0, 0])
o3d.visualization.draw_geometries([arrow])
绘制坐标轴
用o3d.geometry.TriangleMesh.create_coordinate_frame
绘制坐标轴,其中size表示粗细,origin标识坐标原点。
绘制多边形和顶点
可以通过o3d.visualization.Visualizer()
添加我们需要的组件,我们在下面使用了vis.add_geometry
添加了边和点,同样也可以使用它添加上面讲到的长方体、球形等
。
import open3d as o3d
import numpy as np
def polygon():
#绘制顶点
polygon_points = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1],[0,0,5]])
lines = [[0, 1], [1, 2], [2, 3],[3,0]] #连接的顺序,封闭链接
color = [[1, 0, 0] for i in range(len(lines))]
#添加顶点,点云
points_pcd = o3d.geometry.PointCloud()
points_pcd.points = o3d.utility.Vector3dVector(polygon_points)
points_pcd.paint_uniform_color([0, 0.3, 0]) #点云颜色
#绘制线条
lines_pcd = o3d.geometry.LineSet()
lines_pcd.lines = o3d.utility.Vector2iVector(lines)
lines_pcd.colors = o3d.utility.Vector3dVector(color) #线条颜色
lines_pcd.points = o3d.utility.Vector3dVector(polygon_points)
return lines_pcd, points_pcd
if __name__ == "__main__":
axis_pcd = o3d.geometry.TriangleMesh.create_coordinate_frame(size=0.5, origin=[0, 0, 0])
vis = o3d.visualization.Visualizer()
vis.create_window(window_name='绘制多边形')
#vis.toggle_full_screen() #全屏
#设置
opt = vis.get_render_option()
opt.background_color = np.asarray([0, 0, 0]) #背景
opt.point_size = 1 #点云大小
#vis.add_geometry(axis_pcd)
lines, points = polygon()
vis.add_geometry(lines)
vis.add_geometry(points)
#vis.update_geometry(points)
vis.run()
vis.destroy_window()
四、文档和点云数据集
ope3d 官方文档:PointCloud - Open3D 0.18.0 documentation
点云数据:百度网盘链接:https://pan.baidu.com/s/1SDy8PCeQlj0EvZHj_f9XSA
提取码:yqny