|
|
|
|
|
import numpy as np
|
|
|
|
|
|
import config as con
|
|
|
|
|
|
|
|
|
|
|
|
def clip_and_rotate_point_cloud(points, config):
|
|
|
|
|
|
"""
|
|
|
|
|
|
对点云先旋转,再裁剪
|
|
|
|
|
|
|
|
|
|
|
|
:param points: list of [x, y, z], 原始点云数据
|
|
|
|
|
|
:param config: dict, 包含 min_pt, max_pt, rotation 的配置
|
|
|
|
|
|
:return: list of [x, y, z], 旋转并裁剪后的点云
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
# 提取配置参数
|
|
|
|
|
|
min_pt = np.array(config.get("min_pt", [-np.inf] * 3))
|
|
|
|
|
|
max_pt = np.array(config.get("max_pt", [np.inf] * 3))
|
|
|
|
|
|
rotation = np.array(config.get("rotation", [1, 0, 0, 0, 1, 0, 0, 0, 1])).reshape(3, 3)
|
|
|
|
|
|
|
|
|
|
|
|
# 转换为 NumPy 数组
|
|
|
|
|
|
points = np.array(points, dtype=np.float64)
|
|
|
|
|
|
|
|
|
|
|
|
# 1. 先旋转:应用旋转矩阵
|
|
|
|
|
|
rotated_points = (rotation @ points.T).T
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 再裁剪:保留落在 min_pt ~ max_pt 范围内的点
|
|
|
|
|
|
mask = np.all((rotated_points >= min_pt) & (rotated_points <= max_pt), axis=1)
|
|
|
|
|
|
clipped_points = rotated_points[mask]
|
|
|
|
|
|
|
|
|
|
|
|
return clipped_points.tolist()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def merge_point_clouds(clouds, config,sn):
|
|
|
|
|
|
"""
|
|
|
|
|
|
将多个点云沿 x 轴依次拼接在一起
|
|
|
|
|
|
|
|
|
|
|
|
:param clouds: list of (list of [x, y, z]), 多个点云
|
|
|
|
|
|
:return: list of [x, y, z], 合并后的点云
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
min_pt = config.get("min_pt", [0, 0, 0])
|
|
|
|
|
|
max_pt = config.get("max_pt", [0, 0, 0])
|
|
|
|
|
|
# 返回 x 方向的区域宽度
|
|
|
|
|
|
|
|
|
|
|
|
merged = []
|
|
|
|
|
|
current_x_offset = 0
|
|
|
|
|
|
|
|
|
|
|
|
reverse_order = con.CAMERA_CONFIG_MAP[sn].get("reverse_order", False)
|
|
|
|
|
|
for cloud in reversed(clouds) if reverse_order else clouds:
|
|
|
|
|
|
if not cloud:
|
|
|
|
|
|
continue
|
|
|
|
|
|
# 添加偏移后写入结果
|
|
|
|
|
|
offset_cloud = [[p[0] + current_x_offset, p[1], p[2]] for p in cloud]
|
|
|
|
|
|
merged.extend(offset_cloud)
|
|
|
|
|
|
|
|
|
|
|
|
# 获取当前相机采集区域的 x 宽度
|
|
|
|
|
|
x_width = float(max_pt[0] - min_pt[0])
|
|
|
|
|
|
|
|
|
|
|
|
# 更新下一个点云的偏移量(当前偏移 + 当前区域宽度)
|
|
|
|
|
|
# 在下一次删除
|
|
|
|
|
|
current_x_offset += x_width
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return merged,current_x_offset+min_pt[0]
|
|
|
|
|
|
|
|
|
|
|
|
|