【论文笔记】点云配准网络 PCRNet: Point Cloud Registration Network using PointNet Encoding 2019_pcr-net-CSDN博客
【点云配准】【深度学习】Windows11下PCRNet代码Pytorch实现与源码讲解-CSDN博客
【点云配准】【深度学习】Windows11下GCNet代码Pytorch实现与源码讲解_3dlomatch数据集-CSDN博客
zhulf0804/GCNet: Leveraging Inlier Correspondences Proportion for Point Cloud Registration. https://arxiv.org/abs/2201.12094. (github.com) 【论文笔记】点云配准网络 Deep Closest Point: Learning Representations for Point Cloud Registration 2019_deepclosest point-CSDN博客
在 PyTorch 中,可以使用 torch.svd
来实现 SVD 分解,从而计算两个点云之间的变换矩阵 R_{XY}RXY 和平移向量 t_{XY}tXY。以下是完整的实现步骤和代码示例:
pytorch学习:矩阵分解:奇异值分解(SVD分解)_pytorch svd-CSDN博客
实现步骤
-
计算点云中心:
-
计算两个点云 XX 和 YY 的中心点 \bar{x}xˉ 和 \bar{y}yˉ。
-
-
计算互协方差矩阵 HH:
-
通过公式 H = \sum_{i=1}^N (x_i - \bar{x})(y_i - \bar{y})^TH=∑i=1N(xi−xˉ)(yi−yˉ)T 计算互协方差矩阵。
-
-
SVD 分解:
-
对互协方差矩阵 HH 进行 SVD 分解,得到 UU, SS, VV。
-
-
计算变换矩阵 R_{XY}RXY 和平移向量 t_{XY}tXY:
-
变换矩阵 R_{XY} = VU^TRXY=VUT。
-
平移向量 t_{XY} = -R_{XY} \bar{x} + \bar{y}tXY=−RXYxˉ+yˉ。
-
代码实现
import torchdef compute_transformation(X, Y):"""计算从点云 X 到点云 Y 的变换矩阵 R 和平移向量 t:param X: 点云 X, 形状为 (N, 3):param Y: 点云 Y, 形状为 (N, 3):return: 变换矩阵 R (3, 3) 和平移向量 t (3,)"""# 确保输入是 torch.Tensorif not isinstance(X, torch.Tensor):X = torch.tensor(X, dtype=torch.float32)if not isinstance(Y, torch.Tensor):Y = torch.tensor(Y, dtype=torch.float32)# 计算点云中心x_center = X.mean(dim=0) # (3,)y_center = Y.mean(dim=0) # (3,)# 计算互协方差矩阵 HH = torch.zeros(3, 3) # (3, 3)for i in range(X.shape[0]):H += torch.outer(X[i] - x_center, Y[i] - y_center)# SVD 分解U, S, V = torch.svd(H)# 计算变换矩阵 R 和平移向量 tR = V @ U.T # (3, 3)t = -R @ x_center + y_center # (3,)return R, t# 示例数据 X = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=torch.float32) # (3, 3) Y = torch.tensor([[2, 3, 4], [5, 6, 7], [8, 9, 10]], dtype=torch.float32) # (3, 3)# 计算变换矩阵和平移向量 R, t = compute_transformation(X, Y)print("变换矩阵 R:") print(R) print("平移向量 t:") print(t)
代码说明
-
输入数据:
-
X
和Y
是两个点云,形状为(N, 3)
,其中N
是点数,3
是每个点的坐标维度(x, y, z)。
-
-
点云中心:
-
使用
torch.mean
计算点云的中心点。
-
-
互协方差矩阵:
-
使用
torch.outer
计算每个点对的贡献,并累加得到互协方差矩阵 HH。
-
-
SVD 分解:
-
使用
torch.svd
对 HH 进行分解,得到 UU, SS, VV。
-
-
变换矩阵和平移向量:
-
根据公式计算 R_{XY}RXY 和 t_{XY}tXY。
-
示例输出
对于示例数据,输出可能如下:
变换矩阵 R: tensor([[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]]) 平移向量 t: tensor([1., 1., 1.])
注意事项
-
点云匹配:
-
上述代码假设点云 XX 和 YY 已经匹配,即 X[i]X[i] 和 Y[i]Y[i] 是对应的点对。
-
如果点云未匹配,需要先使用 ICP(Iterative Closest Point)或其他方法进行匹配。
-
-
SVD 的数值稳定性:
-
如果互协方差矩阵 HH 是奇异的(例如点云共面),SVD 分解可能不稳定。可以通过添加正则化项或检查奇异值来处理。
-
-
GPU 支持:
-
如果使用 GPU,可以将输入数据移动到 GPU 上:
X = X.to("cuda") Y = Y.to("cuda")
-