视觉SLAM十四讲学习笔记-第三讲-相似、仿射、射影变换和eigen程序、可视化演示

article/2025/8/8 12:36:46

专栏系列文章如下: 

视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客

视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客

视觉SLAM十四讲学习笔记-第二讲-开发环境搭建_goldqiu的博客-CSDN博客

视觉SLAM十四讲学习笔记-第三讲-旋转矩阵和Eigen库_goldqiu的博客-CSDN博客

视觉SLAM十四讲学习笔记-第三讲-旋转向量、欧拉角、四元数_goldqiu的博客-CSDN博客

相似、仿射、射影变换

除了欧氏变换之外,3D空间还存在其他几种变换方式。它们一部分和测量几何有关。欧氏变换保持了向量的长度和夹角,相当于我们把一个刚体原封不动地进行了移动或旋转,不改变它自身的样子。其他几种变换则会改变它的外形。它们都拥有类似的矩阵表示。

相似变换

相似变换比欧氏变换多了一个自由度,它允许物体进行均匀缩放,其矩阵表示为:

旋转部分多了一个缩放因子s,表示我们在对向量旋转之后,可以在 x,y,z 三个坐标上进行均匀缩放。由于含有缩放,相似变换不再保持图形的面积不变。可以想象一个边长为1的立方体通过相似变换后,变成边长为10的样子(但仍然是立方体)。三维相似变换的集合也叫做相似变换群,记作Sim(3)。

仿射变换

仿射变换的矩阵形式如下:

与欧氏变换不同的是,仿射变换只要求A是一个可逆矩阵,而不必是正交矩阵。仿射变换也叫正交投影。经过仿射变换之后,立方体就不再是方的了,但是各个面仍然是平行四边形。

射影变换

射影变换是最一般的变换,它的矩阵形式为:

左上角为可逆矩阵A,右上角为平移t,左下角为缩放a。由于采用了齐次坐标,当 v≠0时,我们可以对整个矩阵除以 v 得到一个右下角为 1 的矩阵;否则得到右下角为 0 的矩阵。因此,2D 的射影变换一共有 8 个自由度,3D 则共有 15 个自由度。射影变换是变换中,形式最为一般的。从真实世界到相机照片的变换可以看成一个射影变换。可以想象一个原本方形的地板砖,在照片当中是什么样子:首先,它不再是方形的。由于近大远小的关系,它甚至不是平行四边形,而是一个不规则的四边形。

总结:在“不变性质”中,从上到下是有包含关系的。例如,欧氏变换除了保体积之外,也具有保平行、相交等性质。

从真实世界到相机照片的变换是一个射影变换。如果相机的焦距为无穷远,那么这个变换为仿射变换。

实践:Eigen几何模块

Eigen几何模块的数据演示

slambook2/ch3/useGeometry/useGeometry.cpp

代码中有注释。

Eigen中对各种形式的表达方式总结如下。每种类型都有单精度和双精度两种数据类型,不能由编译器自动转换。以双精度为例,把最后的d改成f,即得到单精度的数据结构。

• 旋转矩阵(3 × 3):Eigen::Matrix3d。

• 旋转向量(3 × 1):Eigen::AngleAxisd。

• 欧拉角(3 × 1):Eigen::Vector3d。

• 四元数(4 × 1):Eigen::Quaterniond。

• 欧氏变换矩阵(4 × 4):Eigen::Isometry3d。

• 仿射变换(4 × 4):Eigen::Affine3d。

• 射影变换(4 × 4):Eigen::Projective3d。

程序中,演示了如何使用Eigen中的旋转矩阵、旋转向量(AngleAxis)、欧拉角和四元数。

进一步了解Eigen的几何模块可以参考

http://eigen.tuxfamily.org/dox/group__TutorialGeometry.html

注意,程序代码和数学表示有一些细微的差别。例如,通过运算符重载,四元数和三维向量可以直接计算乘法,但在数学上则需要先把向量转成虚四元数,再利用四元数乘法进行计算,同样也适用于变换矩阵乘三维向量的情况。总体而言,程序中的用法会比数学公式更灵活一些。

举例演示坐标变换:

设有机器人一号和机器人二号位于世界坐标系中。记世界坐标系为W,机器人的坐标系为 R1和R2。机器人一号的位姿为q1 = [0.35, 0.2, 0.3, 0.1]T, t1 = [0.3, 0.1, 0.1]T。机器人二号的位姿为q2 = [−0.5, 0.4, −0.1, 0.2]T, t2 = [−0.1, 0.5, 0.3]T。这里的q和t表达的是世界坐标系到相机坐标系的变换关系。机器人一号看到某个点在自身的坐标系下坐标为pR1 = [0.5, 0, 0.2]T,求该向量在机器人二号坐标系下的坐标。

程序为:slambook2/ch3/examples/coordinateTransform.cpp

注意:四元数使用之前需要归一化。

可视化演示

显示运动轨迹

轨迹文件记录了一个机器人的运动轨迹,存储于trajectory.txt,每一行用下面的格式存储:

time,tx,ty,tz,qx,qy,qz,qw, 把它画到一个窗口中。

其中time指该位姿的记录时间,t为平移,q为旋转四元数,均是以世界坐标系到机器人坐标系记录。

在画轨迹的时候,可以把“轨迹”画成一系列点组成的序列。这其实是机器人(相机)坐标系的原点在世界坐标系中的坐标。考虑机器人坐标系的原点,即OR,那么,此时的OW 就是这个原点在世界坐标系下的坐标:

OW正是TWR 的平移部分。因此,可以从TWR中直接看到相机在何处,这是TWR更为直观的原因。在可视化程序里,轨迹文件存储了TWR而不是TRW。

在linux 中,基于OpenGL的Pangolin库,在支持OpenGL的绘图操作基础之上还提供了一些GUI的功能。

使用git的submodule功能来管理依赖的第三方库。可以进入3rdparty文件夹中直接安装所需的库,git保证了使用的版本是一致的。

程序演示了如何在Panglin中画出3D的位姿。用红、绿、蓝三种颜色画出每个位姿的三个坐标轴(计算了各坐标轴的世界坐标),然后用黑色线将轨迹连起来。

程序是:slambook2/ch3/examples/plotTrajectory.cpp

运行步骤:

https://github.com/stevenlovegrove/Pangolin

一开始从github下载最新版本的Pangolin,发现需要3.10的cmake,

然后先安装3.10版本的cmake,

Index of /files/v3.18​cmake.org/files/v3.18/

在官网下载源文件后,解压进去文件夹中

./bootstrap --prefix=/opt/cmake-install

make

make install

sudo gedit ~/.bashrc

#把下面两个命令加入~/.bashrc中

export PATH=/opt/cmake-install/bin:$PATH

export CMAKE_PREFIX_PATH=/opt/cmake-install:$CMAKE_PREFIX_PATH

#保存一下并运行

source ~/.bashrc

后面发现直接从https://github.com/gaoxiang12/slambook2.git

下载的pangolin不需要安装高版本的cmake。

需要安装一些依赖:

sudo apt-get install libglew-dev

sudo apt-get install cmake

sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev

sudo apt-get install libxkbcommon-x11-dev

sudo apt-get install wayland-protocols

然后:

mkdir build && cd build

cmake ..

运行程序遇到Pangolin X11: Unable to retrieve framebuffer options的问题。

解决方法是注释掉Pangolin的源代码src/display/device/display_x11.cpp中的L123-L124,即:

//GLX_SAMPLE_BUFFERS , glx_sample_buffers,

//GLX_SAMPLES , glx_sample_buffers > 0 ? glx_samples : 0,

程序运行结果:

显示相机的位姿

slambook2/ch3/visualizeGeometry 中,以可视化的形式演示了相机位姿的各种表达方式。用鼠标操作相机时,左侧的方框里会实时显示相机位姿对应的旋转矩阵、平移、欧拉角和四元数。效果如下:

习题

1. 验证旋转矩阵是正交矩阵。

2. 寻找罗德里格斯公式的推导过程并加以理解。

3. 验证四元数旋转某个点后,结果是一个虚四元数(实部为零),所以仍然对应到一个三维空间点。

4.总结旋转矩阵、轴角、欧拉角、四元数的转换关系。

5.假设有一个大的 Eigen 矩阵,把它的左上角 3 × 3 的块取出来,然后赋值为单位阵。编程实现。

6. 一般线性方程Ax = b有哪几种做法?在 Eigen 中实现。


http://chatgpt.dhexx.cn/article/cNo3PnnU.shtml

相关文章

多视图几何三维重建实战系列之MVSNet

点击上方“3D视觉工坊”,选择“星标” 干货第一时间送达 1. 概述 MVS是一种从具有一定重叠度的多视图视角中恢复场景的稠密结构的技术,传统方法利用几何、光学一致性构造匹配代价,进行匹配代价累积,再估计深度值。虽然传统方法有较…

一文搞懂NSCT(Nonsubsampled Contourlet)变换,matlab程序实现并讲解NSCT_TOOLBOX的使用方法

文章目录 一、前言二、NSCT理论背景三、NSCT图像表述3.1 图像变换综述3.2 非下采样的金字塔分解3.2 非下采样的方向滤波器组分解 四、NSCT的matlab程序实现五、总结5.1 NSCT现存不足5.2 致谢 一、前言 在这篇文章中我将从图像分解领域的发展方面为大家讲解NSCT的出现背景和实现…

视图几何三维重建实战系列之MVSNet

点击上方“3D视觉工坊”,选择“星标” 干货第一时间送达 1. 概述 MVS是一种从具有一定重叠度的多视图视角中恢复场景的稠密结构的技术,传统方法利用几何、光学一致性构造匹配代价,进行匹配代价累积,再估计深度值。虽然传统方法有较…

[模板匹配霍夫变换]——模板匹配分析、霍夫变换分析

一、模板匹配分析 所谓模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最高的区域…

计算机视觉学习第5章——多视图几何

目录 一、 外极几何 1.1 简单数据集 1.2 用Matplotlib绘制三维数据 1.3 计算F:八点法 1.4 外极点和外极线 二、照相机和三维结构的计算 2.1 三角部分 2.2 由三维点计算照相机矩阵 2.3 由基础矩阵计算照相机矩阵 三、多视图重建 3.1 稳健估计基础矩阵 …

Python计算机视觉——多视图几何

文章目录 第五章 多视图几何5.1 外极几何5.1.1 一个简单的数据集5.1.2 用Matplotlib绘制三维数据5.1.3 计算F:八点法5.1.4 外极点和外极线 5.2 照相机和三维结构的计算5.2.1 三角剖分5.2.2 由三维点计算照相机矩阵5.2.3 由基础矩阵计算照相机矩阵 5.3 多视图重建5.3…

curvelet变换的理解

一、matlab下curvelet工具包配置 首先在curvelet官方网站下载curvelet工具包,解压,其中包含了matlab与C语言两种实现的版本。 打开matlab,点击set path,选择“添加并包含子文件夹”,将有关的matlab代码,即…

java几何画板_geogebra几何画板下载

geogebra几何画板官方版是一款功能十分强大、非常专业的理科几何绘制工具,使用geogebra几何画板官方版您可以在上面画点、向量、线段、直线、多边形、圆锥曲线,甚至是函数以图像的形式呈现到您眼前。geogebra几何画板最新版是款非常不错的软件。 基本简介…

如何远程连接SQL Server数据库

一.设置客户端网络实用工具 点击“开始”-“程序”,在“Microsoft SQL Server”菜单中选择“客户端网络实用工具”。 在“别名”选项中点击“添加”。 在“服务器别名”中,填入您网站域名,在“网络库”区域中点击“TCP/IP”,在…

连接远程Mysql数据库

一、运行环境 数据库:Mysql 数据库所在系统:Linux(Ubuntu) IDE:PyCharm 测试环境:windows10 二、相关配置 1. 切换root用户权限 >> sudo -s2. 修改数据库配置 >> sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf #…

如何配置SQL Server数据库远程连接

本地数据库(SQL Server 2012或以上) 连接外网服务器的数据库,外网的服务器端需要做如下配置: 1、首先是要打开 数据的配置管理工具 2、配置相关的客户端协议,开启TCP/IP 3、数据库默认的远程端口是 1433(不…

远程连接服务器MySQL数据库

1.添加腾讯云安全组规则的MySQL 3306端口,设置相应的安全组规则。 规则设置,例如 2.参考另一篇博客。。。mysql数据库开启远程访问 设置完权限后 3.mysql配置my.cnf 是否不允许外网访问 [rootVM_71_45_centos ~]# vim /etc/my.cnf 找到里面bind-addre…

如何连接远程服务器上的数据库

远程服务器上切换root权限:sudo su root 远程服务器上检查防火墙是否对外开放3306端口:firewall-cmd --query-port3306/tcp 若为false则命令行开放端口:firewall-cmd --add-port3306/tcp 本地再次检查端口是否开放成功:telnet &l…

数据库远程连接

需求介绍 本地项目是SpringBoot项目要连接远程windows服务器上的mysql数据库。 实现步骤 1. 在windows服务器上下载与配置MySQL 1.1下载MySQL 可以在本地下载好后复制到远程服务器上,我是这样干的,服务器上下载太慢了 1.2配置MySQL 配置MySQL是为了…

远程连接sql数据库

[注] up使用sql 2012数据库较多,在这里就拿sql数据库来举例,其他的应该是类比。远程登录时建议使用sa登录,或者新建一个用户去登录sql(网站参考过一些博主,基本都是用sa或者其他用户名登录)。 1、sql数据的…

Mysql 连接远程数据库

一、改表 首先将mysql数据库中的user表中的数据看一下 select host,user from mysql.user; 可以看到root用户只允许localhost登录 我们需要更改一下 update mysql.user set host‘%’ where user‘root’; 更改好了之后再次查看发现已经变了,但是需要注意的是这种方…

java连接远程服务器上的数据库(MySQL)

1. 服务器上的准备工作 Linux服务器上下载并安装mysql服务 输入命令安装mysql服务:#yum install mysql-server即可联网安装mysql服务器输入指令开启mysql服务:#service mysqld start初始化mysql:#mysql_secure_installation接下来的一连串指令只要按照提示输入 y/n并且配置好密…

如何远程连接MySQL数据库

新安装的 MySQL 只有一个 root 用户,默认不开启远程连接。下面以 Ubuntu 系统下的 MySQL 为例,说明如何远程连接 MySQL 数据库。 登录 root 用户 mysql -uroot -pyongdu查看 mysql 数据库中的所有表 mysql> show databases; -------------------- |…

远程连接数据库

Windows系统(远程方) Windows系统功能 1. 启动telnet客户端 需要启动 telnet客户端( 安装完,最好重启电脑 ) telnet 连通性测试: Win r -> cmd -> Telnet www.baidu.com 80 回车后:出现…