open3d点云可视化

参考1:(39条消息) Open3D 点云法向量估计及可视化_点云处理的博客-CSDN博客

参考2:【Open3D】点云可视化 - 知乎 (zhihu.com)

1. Open3D的安装

Open3D的安装比较简单,进入官网按照自己的需求直接下载合适自己的版本就可以了。这里放一波Open3d的官网链接:A Modern Library for 3D Data Processing

图2

2.可视化点云

点云数据存储的文件格式比较多样,常见的有.bin文件 .ply文件 .pcd文件,但其实不管什么文件,存储的都是一个个 [ x , y , z ]数据(有些点云数据里还会包括强度等信息),我们只需要先把这些点转换成open3d可以读取的数据类型,然后就进行可视化就可以了,下面直接放上进行逐句注释的代码。(以.npy文件为例)

import open3d as o3d
import numpy as np 

def main():

    raw_point = np.load('1.npy') #读取1.npy数据  N*[x,y,z]

    #创建窗口对象
    vis = o3d.visualization.Visualizer()
    #设置窗口标题
    vis.create_window(window_name="kitti")
    #设置点云大小
    vis.get_render_option().point_size = 1
    #设置颜色背景为黑色
    opt = vis.get_render_option()
    opt.background_color = np.asarray([0, 0, 0])

    #创建点云对象
    pcd=o3d.open3d.geometry.PointCloud()
    #将点云数据转换为Open3d可以直接使用的数据类型
    pcd.points= o3d.open3d.utility.Vector3dVector(raw_point)
    #设置点的颜色为白色
    pcd.paint_uniform_color([1,1,1])
    #将点云加入到窗口中
    vis.add_geometry(pcd)

    vis.run()
    vis.destroy_window()

    
if __name__=="__main__":
    main()
图3 点云可视化代码运行结果

3.可视化3D Bbox候选框

3D box候选框由八个顶点之间的十二条连线组成,我们要可视化Bbox候选框,那就要通过Label或模型输出内容里的[物体中心点位置(x,y,z),物体长度l,物体宽度w,物体高度h,物体旋转角度rot]这几个信息计算得出八个顶点的位置,最后把这八个点之间的线段可视化出来就可以了。(关于顶点具体计算过程等过几天有时间我再整理一下,这里重点记录下已经计算得出八个顶点的空间信息[8 × (x,y,z)],如何可视化线段)

import open3d as o3d
import numpy as np 

def main():

    points_3dbox = np.load('2.npy') #读取2.npy数据  8*[x,y,z] (八个顶点的空间信息)

    #创建窗口对象
    vis = o3d.visualization.Visualizer()
    #设置窗口标题
    vis.create_window(window_name="kitti")
    #设置点云大小
    vis.get_render_option().point_size = 1
    #设置颜色背景为黑色
    opt = vis.get_render_option()
    opt.background_color = np.asarray([0, 0, 0])
    
    #指明哪两个顶点之间相连
    lines_box = np.array([[0, 1], [1, 2], [0, 3], [2, 3], [4, 5], [4, 7], [5, 6], [6, 7],
                        [0, 4], [1, 5], [2, 6], [3, 7]])
    #设置点与点之间线段的颜色
    colors = np.array([[0, 1, 0] for j in range(len(lines_box))])
    #创建Bbox候选框对象
    line_set = o3d.geometry.LineSet()
    #将八个顶点连接次序的信息转换成o3d可以使用的数据类型
    line_set.lines = o3d.utility.Vector2iVector(lines_box)
    #设置每条线段的颜色
    line_set.colors = o3d.utility.Vector3dVector(colors)
    #把八个顶点的空间信息转换成o3d可以使用的数据类型
    line_set.points = o3d.utility.Vector3dVector(points_3dbox)
    #将矩形框加入到窗口中
    vis.add_geometry(line_set) 

    vis.run()
    vis.destroy_window()

    
if __name__=="__main__":
    main()
图4 3Dbox可视化代码运行结果

最后,我们只需要把2.中的点云和3.中的3Dbox放在同一个对象内可视化,就可以得到图1中的效果了。

 
posted on 2022-11-19 15:53  一杯明月  阅读(1736)  评论(0编辑  收藏  举报