【slam学习】1、像素坐标系、归一化坐标系、相机坐标系、世界坐标系、各类变换含义

目录

第一部分

1. 世界坐标系 (World Coordinates)

2. 相机坐标系 (Camera Coordinates)

3. 归一化坐标系 (Normalized Image Coordinates)

4. 像素坐标系 (Image Coordinates)

第二部分 

1.等距变换的定义

刚体变换(Rigid Transformation):

反射变换(Reflection):

2. 仿射变换(Affine Transformation)

定义

性质

应用

3. 相似变换(Similarity Transformation)

定义

性质

应用

4. 射影变换(Projective Transformation)

定义

性质

应用


1. 世界坐标系 (World Coordinates)

  • 定义:世界坐标系是一个全局的三维坐标系,用来描述物体在真实世界中的位置。
  • 表示:通常用 (X_w, Y_w, Z_w) 表示。

2. 相机坐标系 (Camera Coordinates)

  • 定义:相机坐标系是以相机为中心的三维坐标系,描述了物体相对于相机的位置。
  • 表示:通常用 (X_c, Y_c, Z_c) 表示。
  • 转换:从世界坐标系到相机坐标系的转换通常通过相机的外参矩阵(旋转矩阵 R 和平移向量 t)完成。
  • 用途:用于描述物体在现实世界中的绝对位置,不受任何特定设备或传感器的影响。
  • 世界坐标转化为相机坐标代码
    Vector3d Camera::world2camera ( const Vector3d& p_w, const SE3& T_c_w )
    {
        return T_c_w*p_w;
    }
    
  • 相机坐标转化为世界坐标代码

    Vector3d Camera::camera2world ( const Vector3d& p_c, const SE3& T_c_w )
    {
        return T_c_w.inverse() *p_c;
    }
    

3. 归一化坐标系 (Normalized Image Coordinates)

  • 定义:归一化坐标系是相机坐标系下的一个特殊形式,去除了深度信息,但保留了方向信息。
  • 表示:通常用 (x_n, y_n) 表示。
  • 转换:从相机坐标系到归一化坐标系的转换通过除以深度值 Z_c 完成。

         相机坐标系到归一化坐标系代码

cv::Point2d cameraToNormalized(const cv::Point3d &p_c) {
    // 计算归一化坐标系下的点
    double x_n = p_c.x / p_c.z;
    double y_n = p_c.y / p_c.z;

    return cv::Point2d(x_n, y_n);
}

          归一化坐标到相机坐标代码

cv::Point3d normalizedToCamera(const cv::Point2d &p_n, double depth) {
    // 计算相机坐标系下的点
    double X_c = p_n.x * depth;
    double Y_c = p_n.y * depth;
    double Z_c = depth;

    return cv::Point3d(X_c, Y_c, Z_c);
}

4. 像素坐标系 (Image Coordinates)

  • 定义:像素坐标系是在图像平面上的二维坐标系,描述了像素的位置。
  • 表示:通常用 (u, v) 表示。
  • 转换:从归一化坐标系到像素坐标系的转换通过相机的内参矩阵 K 完成

        

 其中,内参矩阵 K 通常形式如下:

  • fx​ 和 fy是焦距参数。
  • cx和 cy 是主点坐标。
  • 1.等距变换的定义

    等距变换是一种将一个几何对象映射到另一个几何对象的变换,使得任意两点之间的距离在变换前后保持不变。等距变换可以分为两类:

  • 刚体变换(Rigid Transformation)
    • 刚体变换包括旋转和平移。
    • 旋转矩阵 RR 是一个正交矩阵,满足 RTR=IRTR=I 且 det⁡(R)=1det(R)=1。
    • 平移向量 tt 是一个三维向量。
    • 刚体变换可以用一个 4x4 的齐次变换矩阵表示:

    • 对于一个点 PP,变换后的点 P′P′ 为:

  • 反射变换(Reflection)
    • 反射变换是一种特殊的等距变换,它通过一个平面(二维中是一条直线)进行镜像反射。
    • 反射变换可以表示为一个矩阵,例如在二维中通过 x 轴反射的变换矩阵为:

2. 仿射变换(Affine Transformation)

定义

仿射变换是一种线性变换加上一个平移。它可以表示为一个 4x4 的齐次变换矩阵:

其中:

  • AA 是一个 3x3 的矩阵,表示线性变换部分。
  • tt 是一个 3x1 的平移向量。
性质
  • 保持直线:仿射变换将直线映射为直线。
  • 保持共线性:仿射变换保持点的共线性。
  • 保持平行性:仿射变换保持平行线的平行性。
  • 不保持长度和角度:仿射变换一般不保持长度和角度。
应用
  • 图像处理:仿射变换常用于图像的旋转、缩放和平移。
  • 计算机图形学:用于物体的变形和动画。
  • 机器学习:用于数据的预处理和特征变换。

3. 相似变换(Similarity Transformation)

定义

相似变换是一种特殊的仿射变换,它包括旋转、平移和均匀缩放。它可以表示为:

其中:

  • ss 是一个标量,表示均匀缩放因子。
  • RR 是一个 3x3 的旋转矩阵。
  • tt 是一个 3x1 的平移向量。
性质
  • 保持直线:相似变换将直线映射为直线。
  • 保持共线性:相似变换保持点的共线性。
  • 保持平行性:相似变换保持平行线的平行性。
  • 保持角度:相似变换保持角度不变。
  • 保持形状的比例关系:相似变换保持形状的比例关系。
应用
  • 图像配准:用于图像的对齐和匹配。
  • 三维重建:用于保持几何形状的相似性。
  • 计算机视觉:用于目标检测和识别。

4. 射影变换(Projective Transformation)

定义

射影变换是一种更一般的变换,它可以处理透视效果。射影变换可以表示为一个 4x4 的非奇异矩阵:

或者在二维情况下,可以表示为一个 3x3 的矩阵:

性质
  • 保持共线性:射影变换保持点的共线性。
  • 保持共面性:射影变换保持点的共面性。
  • 不保持平行性:射影变换不保持平行线的平行性。
  • 不保持角度和长度:射影变换不保持角度和长度。
应用
  • 图像校正:用于校正图像中的透视畸变。
  • 三维重建:用于从多视图图像中重建三维模型。
  • 计算机视觉:用于处理相机的投影模型和多视图几何。

### 相机坐标系变换的概念与实现 在计算机图形学中,相机坐标系变换是一个重要的过程,它涉及多个阶段的矩阵运算来完成从局部坐标系到最终屏幕坐标的转换。以下是关于相机坐标系变换的核心概念及其在 OpenGL 中的具体实现。 #### 1. 坐标系变换流程概述 整个渲染管线可以分为几个主要步骤: - **局部坐标系 → 模型矩阵变换世界坐标系**:通过模型矩阵将物体从其自身的局部空间映射到全局的世界空间[^1]。 - **世界坐标系 → 视图矩阵变换相机坐标系**:利用视图矩阵 (View Matrix),将场景中的所有顶点从世界坐标系转换到相机所在的本地坐标系[^2]。 - **相机坐标系 → 投影矩阵变换 → 裁剪坐标系**:应用投影矩阵 (Projection Matrix) 将三维几何体压缩成二维平面图像。 - **裁剪坐标系 → 视口变换 → 屏幕坐标**:最后一步是将标准化设备坐标 (NDC) 映射至实际窗口像素位置。 #### 2. 视图矩阵的作用 视图矩阵用于定义摄像机的位置和方向。具体来说: - 如果已知相机世界坐标系下的位姿,则可以通过构建一个 $4 \times 4$ 的齐次变换矩阵描述该关系[^3]。 - 这个矩阵通常由两部分组成——旋转和平移。其中, - **旋转分量**决定了相机朝向; - **平移分量**指定了相机中心相对于世界原点的距离。 对于任意一点 \( P_{\text{world}}(x, y, z) \),经过视图变换后的结果为: \[ P_{\text{camera}} = V \cdot P_{\text{world}}, \] 这里 \(V\) 表示完整的视图矩阵。 #### 3. 构建视图矩阵的方法 一种常见的做法是从给定的目标点、观察者位置以及上方向矢量出发计算所需的参数。假设这些分别为 `eye` (\(E_x, E_y, E_z)\), `at`(\(A_x, A_y, A_z)\)) 和 `up`(\(U_x, U_y, U_z)\): ```cpp glm::vec3 zaxis = glm::normalize(Eye - At); // 正前方指向目标 glm::vec3 xaxis = glm::normalize(glm::cross(up, zaxis)); // 右侧正交于其余两者 glm::vec3 yaxis = glm::cross(zaxis, xaxis); // 新向上垂直面重新调整 // 组合形成最终视图矩阵 glm::mat4 view_matrix( xaxis.x, xaxis.y, xaxis.z, -dot(xaxis,Eye), yaxis.x, yaxis.y, yaxis.z, -dot(yaxis,Eye), zaxis.x, zaxis.y, zaxis.z, -dot(zaxis,Eye), 0 , 0 , 0 , 1 ); ``` 上述代码片段展示了如何基于输入数据手动创建视图矩阵。 #### 4. 在OpenGL中的实践 当使用现代OpenGL编程时,开发者往往借助第三方库(如GLM)简化复杂操作。例如设置透视投影并结合视图矩阵传递给着色器程序如下所示: ```glsl #version 330 core layout(location = 0) in vec3 aPos; uniform mat4 model; uniform mat4 view; uniform mat4 projection; void main() { gl_Position = projection * view * model * vec4(aPos, 1.0); } ``` 此片断说明了如何在一个顶点着色器里接受三个独立的变换矩阵,并依次作用于原始顶点属性之上。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值