-
Notifications
You must be signed in to change notification settings - Fork 0
/
Coordinates.py
79 lines (58 loc) · 4.9 KB
/
Coordinates.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
def cartesan2spherical(x):
"""cartesan to spherical coordinates d笛卡尔->球坐标
Args:
x (... x 3):
Returns:
... x 2:
"""
return torch.stack([torch.atan2(x[..., 1], x[..., 0]), torch.acos(torch.clamp(x[..., 2] / torch.norm(x, dim=-1), -1., 1.)), x[..., 2]], -1)
'''
这个函数c2s用于将笛卡尔坐标(Cartesian coordinates)转换为球面坐标(Spherical coordinates)。下面是对函数的详细解释:
函数参数:
- x: 一个形状为(..., 3)的张量,表示一组三维点的笛卡尔坐标,其中...表示任意数量的前导维度。
函数返回值:
- 一个形状为(..., 3)的张量,表示输入点对应的球面坐标。
球面坐标系由三个量来描述一个点的位置:
1. 方位角(Azimuthal angle)φ: 在x-y平面上,从x轴到点的投影的角度,取值范围为[0, 2π]。
2. 极角(Polar angle)θ: 从z轴到点的连线与z轴的夹角,取值范围为[0, π]。
3. 径向距离(Radial distance)r: 点到原点的距离。
函数的计算步骤:
1. 计算方位角φ:
- 使用torch.atan2(x[..., 1], x[..., 0])计算y坐标与x坐标的反正切值,得到方位角。
- atan2的结果在[-π, π]范围内,根据x和y的符号决定具体的象限。
2. 计算极角θ:
- 首先,使用torch.norm(x, dim=-1)计算每个点到原点的距离r。
- 然后,将x的z坐标除以距离r,得到cos(θ)的值。
- 使用torch.clamp将cos(θ)的值限制在[-1, 1]的范围内,以处理数值误差。
- 最后,使用torch.acos计算cos(θ)的反余弦值,得到极角θ。
3. 保留径向距离r:
- 直接使用x的z坐标作为径向距离r。
4. 使用torch.stack将方位角φ、极角θ和径向距离r在最后一个维度上拼接起来,形成球面坐标的表示。
总的来说,这个函数通过计算三维点的方位角、极角和径向距离,将笛卡尔坐标系下的点转换为球面坐标系下的表示。这种转换在某些应用中很有用,例如在3D视觉中,球面坐标可以用于表示点云的局部几何结构,或者用于定义旋转不变的特征描述符。
函数使用了PyTorch的张量操作,如atan2、norm、clamp、acos和stack,以高效地实现坐标转换。同时,通过在最后一个维度上拼接结果,保持了输入张量的前导维度不变,使得函数可以灵活地处理不同形状的输入数据。
将三维点云投影到球面坐标系可以实现旋转不变性,其原理如下:
1. 旋转不变性的要求:
- 我们希望无论点云如何旋转,最终得到的特征表示都是一致的。
- 换句话说,我们需要找到一种表示方式,使得点云的旋转变换不会改变这种表示。
2. 球面坐标系的特性:
- 在球面坐标系中,一个点的位置由三个量描述:方位角φ、极角θ和径向距离r。
- 其中,方位角φ和极角θ描述了点在球面上的方向,而径向距离r描述了点到原点的距离。
- 当点云发生旋转变换时,每个点的径向距离r保持不变,而方位角φ和极角θ会发生变化。
3. 旋转变换的效果:
- 对点云进行旋转变换,相当于在球面上对每个点进行了一个旋转。
- 这个旋转可以用一个旋转矩阵R来描述,它将点的笛卡尔坐标从一个坐标系转换到另一个坐标系。
- 在球面坐标系下,这个旋转矩阵R可以分解为绕z轴和y轴的两个旋转:R = Rz(φ) * Ry(θ)。
4. 实现旋转不变性:
- 由于旋转变换只改变了点的方位角φ和极角θ,而不改变径向距离r,我们可以通过只考虑径向距离r来实现旋转不变性。
- 具体地,我们可以将每个点的径向距离r作为它的特征表示,忽略方位角φ和极角θ的变化。
- 这样,无论点云如何旋转,每个点的径向距离特征都保持不变,从而实现了旋转不变性。
5. 补充说明:
- 在实际应用中,除了径向距离r,我们还可以考虑一些其他的几何量,如法向量、曲率等,来丰富特征表示。
- 这些几何量通常也具有旋转不变性,可以与径向距离r一起使用,以提高特征的区分能力。
总的来说,将点云投影到球面坐标系,并使用径向距离作为特征表示,可以有效地实现旋转不变性。这是因为旋转变换只影响点在球面上的方向(即方位角和极角),而不影响点到原点的距离(即径向距离)。通过忽略方向信息,只考虑距离信息,我们就可以得到一个对旋转变换保持不变的特征表示。
这种旋转不变性在许多三维视觉任务中非常有用,如点云分类、语义分割、物体识别等,因为它允许模型处理不同视角和方向的三维对象,而无需显式地对其进行归一化或对齐。
'''