点云处理技术之open3d第四篇:使用open3d绘制常用类型——箭头圆柱长方体球形箭头坐标轴和线条

Posted 非晚非晚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了点云处理技术之open3d第四篇:使用open3d绘制常用类型——箭头圆柱长方体球形箭头坐标轴和线条相关的知识,希望对你有一定的参考价值。

文章目录

1. 绘制圆锥

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])

2. 绘制圆柱

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])

3. 绘制长方体

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])

4. 绘制球形

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])

5. 绘制箭头

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])

6. 绘制坐标轴

o3d.geometry.TriangleMesh.create_coordinate_frame绘制坐标轴,其中size表示粗细,origin标识坐标原点。

import open3d as o3d
 
 
mesh_frame = o3d.geometry.TriangleMesh.create_coordinate_frame(
    size=0.6, origin=[-2, -2, -2])

o3d.visualization.draw_geometries([mesh_frame])

7. 绘制多边形和顶点

可以通过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 #点云大小
    opt.point_size = 10
 
    #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() 

8. 一次绘制多个类型

第7节中讲到了,我们可以使用vis.add_geometry逐个添加我们需要绘制的类型,同样我们也可以使用以下方法一次性添加目标。

import open3d as o3d

mesh_box = o3d.geometry.TriangleMesh.create_box(width=1.0,
                                                height=1.0,
                                                depth=1.0)
mesh_box.compute_vertex_normals()
mesh_box.paint_uniform_color([0.9, 0.1, 0.1])
mesh_sphere = o3d.geometry.TriangleMesh.create_sphere(radius=1.0)
mesh_sphere.compute_vertex_normals()
mesh_sphere.paint_uniform_color([0.1, 0.1, 0.7])
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.9, 0.1])
mesh_frame = o3d.geometry.TriangleMesh.create_coordinate_frame(
    size=0.6, origin=[-2, -2, -2])


# 一次性添加方法一:
o3d.visualization.draw_geometries(
    [mesh_box, mesh_sphere, mesh_cylinder, mesh_frame])

# 一次性添加方法二:
o3d.visualization.draw_geometries(
    [mesh_box + mesh_sphere + mesh_cylinder + mesh_frame])

以上是关于点云处理技术之open3d第四篇:使用open3d绘制常用类型——箭头圆柱长方体球形箭头坐标轴和线条的主要内容,如果未能解决你的问题,请参考以下文章

点云处理技术之open3d第一篇:open3d的快速安装简介文件的读写和可视化操作

点云处理技术之open3d第三篇:点云的高级操作篇——点云边界框凸包DBSCAN聚类平面分割和隐点移除

点云处理技术之open3d第二篇:点云的基本操作篇——可视化降采样法向量裁剪和绘制点云

『OPEN3D』1.1 点云处理 python篇

爆肝5万字❤️Open3D 点云数据处理基础(Python版)

Open3d - 将多个点云可视化为视频/动画