open3d点云可视化
参考1:(39条消息) Open3D 点云法向量估计及可视化_点云处理的博客-CSDN博客
参考2:【Open3D】点云可视化 - 知乎 (zhihu.com)
1. Open3D的安装
Open3D的安装比较简单,进入官网按照自己的需求直接下载合适自己的版本就可以了。这里放一波Open3d的官网链接:A Modern Library for 3D Data Processing
图22.可视化点云
点云数据存储的文件格式比较多样,常见的有.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.可视化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()