当前位置: 首页 > news >正文

street_gaussians 点云监督

目录

street_gaussians 点云监督

代码说明

mask_projw 和 mask_projh

提取背景点云:


street_gaussians 点云监督

street-gaussians/lib/utils/waymo_utils.py

    # 运行 COLMAPcolmap_basedir = os.path.join(f'{cfg.model_path}/colmap')# 如果三角化后的稀疏模型不存在,则运行自定义的 Waymo COLMAP 脚本if not os.path.exists(os.path.join(colmap_basedir, 'triangulated/sparse/model')):from script.waymo.colmap_waymo_full import run_colmap_waymorun_colmap_waymo(result)# 构建点云if build_pointcloud:print('构建点云')pointcloud_dir = os.path.join(cfg.model_path, 'input_ply')os.makedirs(pointcloud_dir, exist_ok=True)points_xyz_dict = dict()  # 用于存储点云的三维坐标points_rgb_dict = dict()  # 用于存储点云的颜色信息points_xyz_dict['bkgd'] = []  # 存储背景点的三维坐标points_rgb_dict['bkgd'] = []  # 存储背景点的颜色信息for track_id in object_info.keys():points_xyz_dict[f'obj_{track_id:03d}'] = []  # 为每个对象创建存储三维坐标的键points_rgb_dict[f'obj_{track_id:03d}'] = []  # 为每个对象创建存储颜色信息的键print('从 sfm 点云初始化')points_colmap_path = os.path.join(colmap_basedir, 'triangulated/sparse/model/points3D.bin')points_colmap_xyz, points_colmap_rgb, points_colmap_error = read_points3D_binary(points_colmap_path)points_colmap_rgb = points_colmap_rgb / 255.  # 将颜色值归一化为 0-1 之间print('从 LiDAR 点云初始化')pointcloud_path = os.path.join(datadir, 'pointcloud.npz')pts3d_dict = np.load(pointcloud_path, allow_pickle=True)['pointcloud'].item()pts2d_dict = np.load(pointcloud_path, allow_pickle=True)['camera_projection'].item()for i, frame in tqdm(enumerate(range(start_frame, end_frame+1))):# 获取当前帧的相机索引和文件名idxs = list(range(i * num_cameras, (i+1) * num_cameras))cams_frame = [cams[idx] for idx in idxs]image_filenames_frame = [image_filenames[idx] for idx in idxs]# 读取当前帧的 LiDAR 三维和二维点云数据raw_3d = pts3d_dict[frame]raw_2d = pts2d_dict[frame]# 使用第一个投影相机的信息points_camera_all = raw_2d[..., 0]points_projw_all = raw_2d[..., 1]points_projh_all = raw_2d[..., 2]# 确保每个点至少被相机列表中的一个相机观察到mask = np.array([c in cameras for c in points_camera_all]).astype(np.bool_)# 获取经过筛选的 LiDAR 点云位置和颜色信息points_xyz_vehicle = raw_3d[mask]# 将 LiDAR 点云从车辆坐标系转换到世界坐标系ego_pose = ego_frame_poses[frame]points_xyz_vehicle = np.concatenate([points_xyz_vehicle, np.ones_like(points_xyz_vehicle[..., :1])], axis=-1)points_xyz_world = points_xyz_vehicle @ ego_pose.T  # 应用坐标变换points_rgb = np.ones_like(points_xyz_vehicle[:, :3])  # 初始化颜色信息points_camera = points_camera_all[mask]points_projw = points_projw_all[mask]points_projh = points_projh_all[mask]# 为当前帧的每个相机读取图像并匹配 LiDAR 投影点的颜色for cam, image_filename in zip(cams_frame, image_filenames_frame):mask_cam = (points_camera == cam)image = cv2.imread(image_filename)[..., [2, 1, 0]] / 255.  # 读取图像并将颜色归一化mask_projw = points_projw[mask_cam]mask_projh = points_projh[mask_cam]try:# 根据 LiDAR 投影的二维坐标获取图像中的颜色值mask_rgb = image[mask_projh, mask_projw]points_rgb[mask_cam] = mask_rgbexcept Exception as e:print('---points_projh-----')  # 处理投影超出图像边界的情况points_rgb[mask_cam] = 1  # 为超出边界的点设置默认颜色

代码说明

  1. 运行 COLMAP:检测并运行 COLMAP 三角化的稀疏模型生成脚本(run_colmap_waymo)。
  2. 点云初始化
    • 从 COLMAP 三角化的点云和 LiDAR 数据中初始化点云。
    • 通过对帧进行循环处理,将 LiDAR 点云转换为三维坐标,并投影到相机视图中获取颜色信息。
  3. 颜色匹配:将 LiDAR 点投影到相机图像上,并根据图像的像素颜色为每个点分配颜色。

mask_projw 和 mask_projh

在代码中,mask_projw 和 mask_projh 分别表示投影点的 水平(w) 和 垂直(h) 像素坐标,这些坐标是从 LiDAR 点云投影到相机图像上得到的。

具体作用如下:

mask_projw:表示经过掩码筛选后,LiDAR 点投影到相机图像上的 水平坐标(宽度方向)。
mask_projh:表示经过掩码筛选后,LiDAR 点投影到相机图像上的 垂直坐标(高度方向)。
这些坐标用于从相机图像中获取相应像素的颜色信息,通过以下步骤:

筛选:mask_cam 筛选出属于当前相机的投影点。
坐标提取:mask_projw 和 mask_projh 分别获取投影点的宽度和高度坐标。
颜色匹配:使用 image[mask_projh, mask_projw] 从图像中提取相应像素的颜色值,将其赋给 LiDAR 投影点。

提取背景点云:

            points_xyz_obj_mask = np.zeros(points_xyz_vehicle.shape[0], dtype=np.bool_)  # 初始化用于标记物体点的掩码# 遍历每个物体的跟踪信息for tracklet in object_tracklets_vehicle[i]:track_id = int(tracklet[0])  # 提取物体的跟踪 IDif track_id >= 0:# 获取物体在车辆坐标系下的位姿obj_pose_vehicle = np.eye(4)obj_pose_vehicle[:3, :3] = quaternion_to_matrix_numpy(tracklet[4:8])  # 四元数转换为旋转矩阵obj_pose_vehicle[:3, 3] = tracklet[1:4]  # 物体的平移信息vehicle2local = np.linalg.inv(obj_pose_vehicle)  # 计算局部坐标系到车辆坐标系的变换矩阵# 将点云转换到物体的局部坐标系中points_xyz_obj = points_xyz_vehicle @ vehicle2local.Tpoints_xyz_obj = points_xyz_obj[..., :3]# 获取物体的长宽高并定义其 3D 边界框length = object_info[track_id]['length']width = object_info[track_id]['width']height = object_info[track_id]['height']bbox = [[-length/2, -width/2, -height/2], [length/2, width/2, height/2]]obj_corners_3d_local = bbox_to_corner3d(bbox)  # 将边界框转换为 3D 顶点坐标# 检查点云是否在物体的边界框内points_xyz_inbbox = inbbox_points(points_xyz_obj, obj_corners_3d_local)points_xyz_obj_mask = np.logical_or(points_xyz_obj_mask, points_xyz_inbbox)  # 更新物体点的掩码points_xyz_dict[f'obj_{track_id:03d}'].append(points_xyz_obj[points_xyz_inbbox])  # 将物体点云添加到对应 ID 下points_rgb_dict[f'obj_{track_id:03d}'].append(points_rgb[points_xyz_inbbox])  # 将物体颜色添加到对应 ID 下# 提取不属于物体的背景点云信息points_lidar_xyz = points_xyz_world[~points_xyz_obj_mask][..., :3]points_lidar_rgb = points_rgb[~points_xyz_obj_mask]points_xyz_dict['bkgd'].append(points_lidar_xyz)  # 将背景点云添加到背景键下points_rgb_dict['bkgd'].append(points_lidar_rgb)  # 将背景颜色信息添加到背景键下


http://www.mrgr.cn/news/59361.html

相关文章:

  • crontab定时
  • 群晖系统基本命令
  • Vue全栈开发旅游网项目首页
  • 论1+2+3+4+... = -1/12 的不同算法
  • 通过HBase实现大规模日志数据存储与分析
  • github上传文件代码以及其它github代码
  • 2024年MathorCup妈杯大数据竞赛选题人数发布
  • MATLAB深度学习杂草识别系统
  • Python | Leetcode Python题解之第513题找树左下角的值
  • C++,STL 048(24.10.25)
  • XCode16中c++头文件找不到解决办法
  • SQLI LABS | Less-12 POST-Error Based-Double quotes-String-with twist
  • 第二十六节 直方图均衡化
  • S-Function
  • Python | Leetcode Python题解之第514题自由之路
  • Leetcode刷题笔记13
  • 安全日志里提示:C:\Windows\System32\dasHost.exe
  • mysql5.7.44 arm 源码编译安装
  • Linux常用命令1
  • python源码编译—Cython隐藏源码(windows)