这是一个室外点云可视化的代码框架,通过编写自己的"过滤函数"实现对点云的处理,并能方便地对处理后的数据进行可视化
本项目文件目录如下
PointCloudMaster ├─demo │ ├─demo0_visualize.py │ ├─demo1_filter1.py │ ├─demo2_filter2.py │ ├─demo3_Filters_and_Tools.py │ ├─demo4_draw_global_map.py │ ├─demo5_compare.py │ ├─demo6_voxel_and_octree.py │ └─demo7_kitti_tracking.py ├─utils │ ├─__init__.py │ ├─filters.py │ ├─tools.py │ └─visualizer.py ├─sceneloader │ ├─__init__.py │ ├─datasets.json │ ├─hosts.json │ ├─scene_loader.py │ └─数据集.py ├─options.py ├─requirements.txt └─README.md demo:帮助你快速上手的演示示例utils:包含可视化工具以及其他工具函数sceneloader:数据加载相关文件options.py:默认运行参数requirements.txt:项目依赖包列表README.md:就是你现在在看的这个文档
安装:
-
作者的python版本为3.8.18, 请确保你使用的环境中python版本为3.8
-
运行
pip install -r requirements.txt指令安装依赖 -
请阅读并运行
demo文件夹下的演示代码
其中包含许多工具函数
| 函数 | 作用 |
|---|---|
get_bbox_from_points | 从点云中获取包围盒 |
get_bbox_by_corners | 根据八个角点获取包围盒 |
get_arrow | 获取箭头 |
euler2mat | 欧拉角转旋转矩阵 |
get_id_times | 获取每个id的出现次数 |
get_sphere | 获取球体 |
dbscan | 使用sklearn的dbscan进行聚类 |
dbscan2 | 使用open3d的dbscan进行聚类 |
mean_shift | 使用sklearn的mean_shift进行聚类 |
kmeans | 使用sklearn的kmeans进行聚类 |
xyz2abrho | 将三维空间点云转换为极坐标空间点云 |
inverse_rigid_trans | 对刚体变换矩阵求逆 |
其中包含很多常用的过滤函数
| 函数 | 作用 |
|---|---|
xyz2v | 将三维空间点云转换为速度空间点云 |
add_noise_v | 为速度添加高斯噪声 |
add_noise_xyz | 在3d点云射线长度上添加高斯噪声 |
remove_points_by_mask | 去除mask所对应的点 |
remain_points_by_mask | 保留mask所对应的点 |
remove_points_by_id | 通过id去除点 |
remain_points_by_id | 通过id保留点 |
remain_points_by_z_axis | 保留z轴在一定范围之间的点 |
remain_points_by_range | 保留范围内的点 |
- 在
sceneloader/datasets.json中按照格式添加数据集每个场景的点云存放目录以及位姿文件位置
{ "datasets": [ ...其他数据集 { "name": "这里填写数据集的名字,不要与其他数据集相同", "hostname": "服务器名字,如果是本地数据集则不需要此字段,或者填写localhost", "root_path": "数据集根目录位置", "scenes": [ { "scene_id": 0, "pcd_path": "0号场景点云存放目录,确保该目录下只有点云文件,路径相对于数据集根目录", 后面可以根据数据集继续添加数据集特有的数据路径,如图片路径,标签路径,车辆状态路径等等 }, { "scene_id": 1, "pcd_path": "1号场景点云存放目录,确保该目录下只有点云文件,路径相对于数据集根目录", 后面可以根据数据集继续添加数据集特有的数据路径,如图片路径,标签路径,车辆状态路径等等 }, ... ] } ] }- 如果数据集存放在服务器上,则需要填写
hostname字段,否则不需要或者填写localhost。hostname字段与sceneloader/hosts.json中的服务器名字对应 sceneloader/hosts.json中填写服务器的信息,格式如下
{ "hosts":[ { "hostname": "服务器名字", "ip": "服务器ip", "username": "服务器用户名", "private_key": "本机存放ssh私钥的位置,如C:/Users/Admin/.ssh/id_rsa" }, ... 其他服务器信息 ] }- 在
sceneloader目录下添加python文件,文件命名为:数据集名字.py- 文件中按照以下模板进行实现,注意:类的命名要为
数据集名字 load_frame(self, frame_id):加载某一帧的数据。返回一个大小为N*3的numpy点云数据pcd_xyz,和一个字典other_data,该字典的key为字符串,值为对应数据。每个数据集包含的数据都有区别,这些数据都被存放在other_data中
- 文件中按照以下模板进行实现,注意:类的命名要为
from sceneloader import DatasetLoader_Base import os class name(DatasetLoader_Base): def __init__(self, scene_id, json_data): super(DatasetLoader_Name, self).__init__(scene_id, json_data) # 在此可以添加数据集特有的初始化操作 def load_frame(self, frame_id): pcd_path = os.path.join(self.pcd_data_path, self.filenames[frame_id]) # 在此实现方法以读取点云等数据 # 除了点云数据外,还可以读取其他数据,如图片,标注,这些数据都应该存放在other_data中 ... return pcd_xyz, other_data- 注意,如果数据集存放在服务器上,则需要使用以下方法来获取数据(本地数据这么写也不会有影响)。其本质是将数据从服务器上下载到本地,然后再读取。当with语句结束时,会自动删除本地数据
with self.remote.get(远程数据路径) as 本地数据路径: load(本地数据路径)- 注意,如果数据集存放在服务器上,需要获取某个目录下的所有文件名,可以使用以下方法(本地数据这么写也不会有影响)
file_list = self.remote.listdir(远程目录路径)other_data是点云数据中除了x,y,z以外的所有数据。由于不同数据集的点云字段各不相同,因此设计了该数据结构
other_data是一个字典,键为字符串,值为任意其他数据。注意,字符串的命名根据其作用是具有一定的要求的:
- 以
pointinfo-开头的数据表示点云中每个点的属性值,比如颜色pointinfo-color,标签pointinfo-label等。这些数据的长度要与点云数量对应。其中pointinfo-color较为特殊,若有,则会在可视化中绘制出来 - 以
geometry-开头的数据表示几何元素,若有,则会在可视化中绘制出来。目前支持的有geometry-bboxes,geometry-arrows,geometry-spheres。这些数据为列表类型,列表中为单个的几何元素 - 以
pose-开头的数据表示位姿信息,pose-R表示旋转矩阵,pose-T表示平移向量