实习第一周笔记
总结梳理 2D 任务中各标签类型(包括但不限于点线面)的表示方式
1. 点(Point)
- 定义:表示一个单个位置的坐标。
- 表示方式:
-
- 笛卡尔坐标系:
-
-
- 直接使用二维坐标 (x, y)。
- 像素坐标系(图像左上角为原点)。
-
-
- 归一化坐标系:
-
-
- 将坐标归一化到 [0, 1],例如
(x_norm, y_norm) = (x / image_width, y / image_height)
。
- 将坐标归一化到 [0, 1],例如
-
-
- 极坐标系:
-
-
- 将点表示为半径和角度,例如
(r, θ)
。
- 将点表示为半径和角度,例如
-
- 应用:
-
- 关键点检测(如人脸关键点、姿态估计中的关节点)。
2. 线(Line)
- 定义:由两个或多个点连接而成的线段或曲线。
- 表示方式:
-
- 两点式:
-
-
- 通过两个端点坐标表示,例如
((x1, y1), (x2, y2))
。
- 通过两个端点坐标表示,例如
-
-
- 参数式:
-
-
- 斜率和截距形式:
y = kx + b
。 - 向量形式:起点和方向向量。
- 斜率和截距形式:
-
-
- 分段线段:
-
-
- 通过一系列点坐标表示,例如
[(x1, y1), (x2, y2), ..., (xn, yn)]
。
- 通过一系列点坐标表示,例如
-
- 应用:
-
- 边缘检测、车道线检测、建筑结构线提取。
3. 矩形(Bounding Box)
- 定义:表示一个闭合的矩形区域,通常用于包围目标对象。
- 表示方式:
-
- 绝对坐标系:
-
-
- 左上角和右下角坐标:
(xmin, ymin, xmax, ymax)
。 - 中心坐标和宽高:
(center_x, center_y, width, height)
。
- 左上角和右下角坐标:
-
-
- 归一化坐标系:
-
-
- 将坐标归一化到 [0, 1]。
-
-
- 其他形式:
-
-
- 左上角坐标和宽高:
(xmin, ymin, width, height)
。 - 右下角坐标和宽高:
(xmax, ymax, width, height)
。
- 左上角坐标和宽高:
-
- 应用:
-
- 目标检测(如 YOLO、SSD)。
4. 多边形(Polygon)
- 定义:由三个或更多顶点组成的闭合区域。
- 表示方式:
-
- 顶点坐标列表:
-
-
- 按顺时针或逆时针顺序列出顶点坐标,例如
[(x1, y1), (x2, y2), ..., (xn, yn), (x1, y1)]
。
- 按顺时针或逆时针顺序列出顶点坐标,例如
-
-
- 掩码(Mask):
-
-
- 二值掩码形式,多边形区域内像素值为1,区域外为0。
-
-
- RLE(Run-Length Encoding):
-
-
- 用于压缩掩码数据,常用于实例分割任务。
-
- 应用:
-
- 实例分割(如 Mask R-CNN)。
5. 面(Region or Mask)
- 定义:表示一个任意形状的区域,通常用于描述目标的轮廓。
- 表示方式:
-
- 多边形形式:
-
-
- 见上面多边形的表示方式。
-
-
- 掩码形式:
-
-
- 二值掩码,表示区域内的像素。
-
-
- 轮廓(Contour):
-
-
- 通过一系列边界点表示,例如
[(x1, y1), (x2, y2), ..., (xn, yn)]
。
- 通过一系列边界点表示,例如
-
- 应用:
-
- 语义分割、实例分割。
6. 其他几何形状
(1)圆(Circle)
- 定义:表示一个圆形的几何形状。
- 表示方式:
-
- 中心坐标和半径:
(center_x, center_y, radius)
。 - 圆形区域的掩码:用二值掩码表示圆内区域。
- 中心坐标和半径:
- 应用:
-
- 圆形的检测(如交通标志检测中的圆形标志)。
(2)椭圆(Ellipse)
- 定义:表示一个椭圆形的几何形状。
- 表示方式:
-
- 中心坐标、长轴、短轴和旋转角度:
(center_x, center_y, major_axis, minor_axis, angle)
。 - 参数方程:用参数方程表示椭圆的边界点。
- 中心坐标、长轴、短轴和旋转角度:
- 应用:
-
- 椭圆形的检测(如某些特定的目标检测任务)。
(3)曲线(Curve)
- 定义:表示一条平滑的曲线,通常由多个控制点定义。
- 表示方式:
-
- 贝塞尔曲线(Bezier Curve):通过控制点定义曲线。
- 样条曲线(Spline Curve):通过分段多项式定义。
- 应用:
-
- 图像中复杂曲线的表示(如手写笔迹、植物轮廓)。
7. 标注信息(Annotations)
- 定义:除了几何形状外,标签通常还包括其他信息,如类别标签、属性、置信度等。
- 表示方式:
-
- 类别标签:
-
-
- 用整数ID或字符串表示类别,例如
{0: "car", 1: "person"}
。
- 用整数ID或字符串表示类别,例如
-
-
- 属性:
-
-
- 用键值对表示,例如
{"color": "red", "size": "large"}
。
- 用键值对表示,例如
-
-
- 置信度:
-
-
- 表示预测或标注的置信度,例如
0.85
。
- 表示预测或标注的置信度,例如
-
- 应用:
-
- 丰富了对象的描述,支持更复杂的任务(如目标检测中的多属性分类)。
不同坐标系的表示方式对比
坐标系 | 特点 | 常用表示 | 适用场景 |
笛卡尔坐标系 | 图像左上角为原点 | (x, y) | 像素级标注、目标检测 |
归一化坐标系 | 坐标范围在 [0, 1] | (x_norm, y_norm) | 跨分辨率标注、模型输入 |
极坐标系 | 表示角度和半径关系 | (r, θ) | 特殊形状的表示(如圆、椭圆) |
图像坐标系 | 基于像素网格 | (row, col) 或 (pixel_x, pixel_y) | 像素级操作、图像处理 |
总结
在 2D 任务中,不同标签类型的表示方式取决于具体的任务需求和应用场景。以下是一些常用的表示方式总结:
标签类型 | 常见表示方式 | 应用场景 |
点 | (x, y)、(r, θ) | 关键点检测、姿态估计 |
线 | ((x1, y1), (x2, y2))、斜率截距、向量 | 边缘检测、车道线检测 |
矩形 | (xmin, ymin, xmax, ymax)、(center_x, center_y, width, height) | 目标检测 |
多边形 | [(x1, y1), (x2, y2), ..., (xn, yn)]、掩码 | 实例分割、语义分割 |
圆 | (center_x, center_y, radius) | 圆形目标检测 |
椭圆 | (center_x, center_y, major_axis, minor_axis, angle) | 椭圆形目标检测 |
曲线 | 贝塞尔曲线、样条曲线 | 复杂曲线表示 |
标注信息 | 类别标签、属性、置信度 | 目标检测、语义分割、实例分割 |
通过灵活选择不同坐标系和表示方式,可以更高效地完成 2D 任务中的标注与处理。
2. 基于 2D 认识,学习如何描述三维空间中的点、线、面、体;可以重点关注包围盒(Bounding Box)的表示方法,理解刚体旋转和平移; 以上内容需形成利于表达但简易的成果文档,如果可以结合代码效果更佳;对于概念厘清,可以重点关注欧拉角、四元数、旋转矩阵、旋转向量;
三维空间中的点、线、面、体描述与刚体变换
本文将从 2D 空间的基础知识出发,逐步扩展到三维空间中的点、线、面、体的描述方法,并重点介绍包围盒(Bounding Box)的表示方法、刚体旋转和平移的概念。同时,结合欧拉角、四元数、旋转矩阵、旋转向量等概念,帮助读者理解三维空间中的刚体变换。
1. 三维空间中的点、线、面、体描述
1.1 点(Point)
- 定义:三维空间中的一个位置。
- 表示方式:
-
- 笛卡尔坐标系:
(x, y, z)
。 - 齐次坐标:
(x, y, z, 1)
,用于方便矩阵运算。 - 球坐标系:
(r, θ, φ)
,其中r
是半径,θ
是极角,φ
是方位角。
- 笛卡尔坐标系:
- 代码示例:
point_3d = (1.0, 2.0, 3.0) # 笛卡尔坐标系
1.2 线(Line)
- 定义:由两个点连接而成的线段。
- 表示方式:
-
- 两点式:通过两个端点坐标表示,例如
((x1, y1, z1), (x2, y2, z2))
。 - 参数式:
P(t) = P0 + t * (P1 - P0)
,其中t
是参数,P0
和P1
是端点。 - 方向向量:
(dx, dy, dz)
表示方向。
- 两点式:通过两个端点坐标表示,例如
- 代码示例:
line_3d = ((1.0, 2.0, 3.0), (4.0, 5.0, 6.0)) # 两点式
1.3 面(Plane)
- 定义:由三个或更多点组成的平面。
- 表示方式:
-
- 平面方程:
Ax + By + Cz + D = 0
,其中(A, B, C)
是法向量,D
是常数。 - 三点式:通过三个点定义平面。
- 法向量和点:
(normal_vector, point_on_plane)
。
- 平面方程:
- 代码示例:
plane_equation = (1.0, 2.0, 3.0, 4.0) # Ax + By + Cz + D = 0
1.4 体(Volume)
- 定义:由多个面组成的闭合区域。
- 表示方式:
-
- 包围盒(Bounding Box):见下文。
- 多边形网格(Polygon Mesh):通过顶点和面片表示。
- 体素(Voxel):三维像素表示。
- 代码示例:
bounding_box = ((1.0, 2.0, 3.0), (4.0, 5.0, 6.0)) # 最小点和最大点
2. 包围盒(Bounding Box)的表示方法
2.1 轴对齐包围盒(AABB)
- 定义:边与坐标轴平行的包围盒。
- 表示方式:
-
- 最小点和最大点:
(min_x, min_y, min_z)
和(max_x, max_y, max_z)
。 - 中心点和半长:
(center_x, center_y, center_z)
和(half_width, half_height, half_depth)
。
- 最小点和最大点:
- 代码示例:
aabb = ((1.0, 2.0, 3.0), (4.0, 5.0, 6.0)) # 最小点和最大点
2.2 定向包围盒(OBB)
- 定义:边可以任意旋转的包围盒。
- 表示方式:
-
- 中心点、半长和旋转矩阵:
(center, half_extents, rotation_matrix)
。 - 中心点、半长和四元数:
(center, half_extents, quaternion)
。
- 中心点、半长和旋转矩阵:
- 代码示例:
obb = {
"center": (1.0, 2.0, 3.0),
"half_extents": (1.0, 2.0, 3.0),
"rotation_matrix": [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # 单位矩阵
}
3. 刚体旋转和平移
3.1 刚体变换
- 定义:刚体在三维空间中的旋转和平移。
- 表示方式:
-
- 齐次变换矩阵:4x4 矩阵,包含旋转和平移信息。
- 旋转和平移分离:
(rotation_matrix, translation_vector)
。
- 代码示例:
transform_matrix = [
[1, 0, 0, 1.0],
[0, 1, 0, 2.0],
[0, 0, 1, 3.0],
[0, 0, 0, 1]
] # 旋转矩阵 + 平移向量
3.2 旋转表示方法
(1)欧拉角(Euler Angles)
- 定义:通过绕三个坐标轴的旋转角度表示。
- 缺点:存在万向节锁问题。
- 代码示例:
euler_angles = (30.0, 45.0, 60.0) # 绕 x, y, z 轴的旋转角度
(2)四元数(Quaternion)
- 定义:用四个数表示旋转,避免万向节锁问题。
- 代码示例:
quaternion = (0.707, 0.0, 0.707, 0.0) # (w, x, y, z)
(3)旋转矩阵(Rotation Matrix)
- 定义:3x3 矩阵表示旋转。
- 代码示例:
rotation_matrix = [
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]
] # 单位矩阵
(4)旋转向量(Rotation Vector)
- 定义:用旋转轴和旋转角度表示。
- 代码示例:
rotation_vector = (0.0, 0.0, 1.0, 45.0) # (x, y, z, angle)
4. 代码实现示例
以下是一个简单的 Python 示例,展示如何表示三维空间中的点、包围盒和刚体变换:
import numpy as np
# 三维点
point_3d = np.array([1.0, 2.0, 3.0])
# 轴对齐包围盒 (AABB)
aabb_min = np.array([1.0, 2.0, 3.0])
aabb_max = np.array([4.0, 5.0, 6.0])
# 定向包围盒 (OBB)
obb_center = np.array([1.0, 2.0, 3.0])
obb_half_extents = np.array([1.0, 2.0, 3.0])
obb_rotation_matrix = np.eye(3) # 单位矩阵
# 刚体变换
rotation_matrix = np.eye(3) # 单位矩阵
translation_vector = np.array([1.0, 2.0, 3.0])
transform_matrix = np.eye(4)
transform_matrix[:3, :3] = rotation_matrix
transform_matrix[:3, 3] = translation_vector
print("Point 3D:", point_3d)
print("AABB Min:", aabb_min, "AABB Max:", aabb_max)
print("OBB Center:", obb_center, "OBB Half Extents:", obb_half_extents)
print("Transform Matrix:\n", transform_matrix)
5. 总结
本文从 2D 空间的基础知识出发,详细介绍了三维空间中的点、线、面、体的表示方法,重点讲解了包围盒的表示方法以及刚体旋转和平移的概念。通过欧拉角、四元数、旋转矩阵、旋转向量等表示方法,帮助读者理解三维空间中的刚体变换。结合代码示例,读者可以更好地掌握这些概念的实际应用。
欧拉角、四元数、旋转矩阵、旋转向量
在三维图形学和机器人学中,旋转是非常重要的概念。为了描述物体在三维空间中的旋转,有多种数学表示方法,包括欧拉角、四元数、旋转矩阵和旋转向量。每种方法都有其优点和缺点,在不同的应用场景中选择合适的方法至关重要。本节将详细介绍这四种旋转表示方法,并提供示例代码。
1. 欧拉角 (Euler Angles)
定义:欧拉角通过三个旋转角度来描述物体的姿态,通常表示为绕三个坐标轴的旋转。常见的表示方式有:
- XYZ 欧拉角:先绕 X 轴旋转,再绕 Y 轴旋转,最后绕 Z 轴旋转。
- ZYX 欧拉角(也称为航向-俯仰-滚转角):先绕 Z 轴旋转(航向),再绕 Y 轴旋转(俯仰),最后绕 X 轴旋转(滚转)。
优点:
- 直观易懂,与人类的视角一致。
- 参数简单,只有三个角度。
缺点:
- 万向锁问题:在某些旋转序列中,可能会导致失去一个自由度。
- 旋转顺序依赖:不同的旋转顺序会导致不同的结果。
代码示例:
import numpy as np
# 定义欧拉角(XYZ顺序,单位为度)
roll = 30.0 # 绕X轴旋转
pitch = 45.0 # 绕Y轴旋转
yaw = 60.0 # 绕Z轴旋转
# 将角度转换为弧度
roll_rad = np.radians(roll)
pitch_rad = np.radians(pitch)
yaw_rad = np.radians(yaw)
# 构建旋转矩阵
R_x = np.array([
[1, 0, 0],
[0, np.cos(roll_rad), -np.sin(roll_rad)],
[0, np.sin(roll_rad), np.cos(roll_rad)]
])
R_y = np.array([
[np.cos(pitch_rad), 0, np.sin(pitch_rad)],
[0, 1, 0],
[-np.sin(pitch_rad), 0, np.cos(pitch_rad)]
])
R_z = np.array([
[np.cos(yaw_rad), -np.sin(yaw_rad), 0],
[np.sin(yaw_rad), np.cos(yaw_rad), 0],
[0, 0, 1]
])
# 合成总的旋转矩阵
rotation_matrix = R_z @ R_y @ R_x
print("Rotation Matrix from Euler Angles:\n", rotation_matrix)
2. 四元数 (Quaternion)
定义:四元数是一种扩展的复数,由四个数表示:一个实部和三个虚部。在三维旋转中,四元数可以表示为 q = w + x*i + y*j + z*k
,其中 w
是实部,x, y, z
是虚部。
优点:
- 没有万向锁问题:四元数可以表示任何旋转,不会损失自由度。
- 插值平滑:适合动画和路径规划中的平滑旋转插值(如球面线性插值 Slerp)。
- 计算效率高:相对于旋转矩阵,四元数的乘法和插值计算更高效。
缺点:
- 不易直观理解:相对于欧拉角,四元数的概念较为抽象。
- 奇异性:当旋转角度为 180 度时,四元数存在奇异性。
代码示例:
import numpy as np
# 定义四元数(w, x, y, z)
quaternion = np.array([0.707, 0, 0, 0.707]) # 代表绕Z轴旋转90度
# 将四元数转换为旋转矩阵
def quaternion_to_matrix(q):
w, x, y, z = q
matrix = np.array([
[1 - 2*(y**2 + z**2), 2*(x*y - z*w), 2*(x*z + y*w)],
[2*(x*y + z*w), 1 - 2*(x**2 + z**2), 2*(y*z - x*w)],
[2*(x*z - y*w), 2*(y*z + x*w), 1 - 2*(x**2 + y**2)]
])
return matrix
rotation_matrix = quaternion_to_matrix(quaternion)
print("Rotation Matrix from Quaternion:\n", rotation_matrix)
3. 旋转矩阵 (Rotation Matrix)
定义:旋转矩阵是一个 3x3 的正交矩阵,其行列式为1,用于表示坐标系之间的旋转关系。
优点:
- 直观:可以直接用于向量的旋转变换。
- 数学性质明确:正交矩阵的性质保证了旋转的保距性和可逆性。
缺点:
- 参数冗余:9个数表示只有3个自由度的旋转。
- 计算量大:相对于四元数,矩阵乘法计算较耗时。
代码示例:
import numpy as np
# 定义旋转矩阵(例如,绕Z轴旋转45度)
theta = np.radians(45)
rotation_matrix = np.array([
[np.cos(theta), -np.sin(theta), 0],
[np.sin(theta), np.cos(theta), 0],
[0, 0, 1]
])
print("Rotation Matrix:\n", rotation_matrix)
4. 旋转向量 (Rotation Vector)
定义:旋转向量通过一个向量来表示旋转,向量的方向表示旋转轴,向量的长度表示旋转角度(弧度制)。
优点:
- 参数简洁:只有三个参数表示旋转。
- 易于理解:直接关联旋转轴和旋转角度。
缺点:
- 小角度近似:在旋转角度较小时,旋转向量与角速度向量一致,但大角度时需要转换为其他表示。
代码示例:
import numpy as np
from scipy.spatial.transform import Rotation as R
# 定义旋转向量(旋转轴和角度)
axis = np.array([0, 0, 1]) # 绕Z轴
angle = np.radians(60) # 60度
rotation_vector = angle * axis
# 将旋转向量转换为旋转矩阵
rotation = R.from_rotvec(rotation_vector)
rotation_matrix = rotation.as_matrix()
print("Rotation Matrix from Rotation Vector:\n", rotation_matrix)
总结
- 欧拉角:直观,但存在万向锁问题。
- 四元数:无万向锁,适合插值,但较难直观理解。
- 旋转矩阵:直观,数学性质明确,但参数冗余。
- 旋转向量:参数简洁,易于理解,但大角度时需要转换。
选择哪种表示方法取决于具体的应用场景和需求。例如,动画插值中常使用四元数,而物理仿真可能更倾向于旋转矩阵。理解这些表示方法之间的转换和关系对于处理三维旋转问题至关重要。
参考代码
以下是一个综合示例,展示如何在不同旋转表示之间进行转换:
import numpy as np
from scipy.spatial.transform import Rotation as R
# 定义欧拉角(XYZ顺序,单位为度)
roll = 30.0 # 绕X轴旋转
pitch = 45.0 # 绕Y轴旋转
yaw = 60.0 # 绕Z轴旋转
# 将角度转换为弧度
roll_rad = np.radians(roll)
pitch_rad = np.radians(pitch)
yaw_rad = np.radians(yaw)
# 构建旋转矩阵
R_x = np.array([
[1, 0, 0],
[0, np.cos(roll_rad), -np.sin(roll_rad)],
[0, np.sin(roll_rad), np.cos(roll_rad)]
])
R_y = np.array([
[np.cos(pitch_rad), 0, np.sin(pitch_rad)],
[0, 1, 0],
[-np.sin(pitch_rad), 0, np.cos(pitch_rad)]
])
R_z = np.array([
[np.cos(yaw_rad), -np.sin(yaw_rad), 0],
[np.sin(yaw_rad), np.cos(yaw_rad), 0],
[0, 0, 1]
])
# 合成总的旋转矩阵
rotation_matrix = R_z @ R_y @ R_x
print("Rotation Matrix from Euler Angles:\n", rotation_matrix)
# 将旋转矩阵转换为四元数
rotation = R.from_matrix(rotation_matrix)
quaternion = rotation.as_quat() # (x, y, z, w)
print("Quaternion from Rotation Matrix:", quaternion)
# 将四元数转换回旋转矩阵
rotation_matrix_from_quaternion = rotation.as_matrix()
print("Rotation Matrix from Quaternion:\n", rotation_matrix_from_quaternion)
# 定义旋转向量(旋转轴和角度)
axis = np.array([0, 0, 1]) # 绕Z轴
angle = np.radians(60) # 60度
rotation_vector = angle * axis
# 将旋转向量转换为旋转矩阵
rotation = R.from_rotvec(rotation_vector)
rotation_matrix_from_rotvec = rotation.as_matrix()
print("Rotation Matrix from Rotation Vector:\n", rotation_matrix_from_rotvec)
# 将旋转矩阵转换为欧拉角(XYZ顺序)
euler_angles = rotation.as_euler('xyz', degrees=True)
print("Euler Angles from Rotation Matrix:", euler_angles)