精华内容
下载资源
问答
  • 变换矩阵
    千次阅读
    2018-10-27 16:58:25

    1、变换矩阵

    变换矩阵可以分解为缩放,旋转,平移矩阵的乘积:

    M = T * R * S - 右手坐标系

    当均匀缩放时,旋转和缩放可以交换顺序

    缩放和平移不可以交换顺序

    2、子坐标系与父坐标系

    由在父坐标系中的坐标位置P,和三根轴X,Y,Z可定义一个子标系,按列构成一个变换矩阵[X,Y,Z,P],这个矩阵构成由子标系变换到父坐标系的变换矩阵。DX里面需要转置一下。即按行构造。

    一个例子是视图矩阵的构建,子空间由视点和三根正交轴定义,视图矩阵则是由它们构成的列矩阵的仿射求逆-由世界变换到视图空间。

    另一个例子世界变换矩阵,它由新模型坐标系的位置和三根轴【定义在世界空间】按列构成。即由模型空间变换到世界空间。初始情况模型空间与世界空间是对齐的。

    3、投影矩阵-OpenGL

    透视投影矩阵:

    可以知道投影变换后的w=-Ze,即在视图空间的深度

    在投影面上的坐标Xp, Yp为:Xp=n*Xe/-Ze=Xclip/w*r,Yp=n*Ye/-Ze=Yclip/w*t

    投影后Ze从[-n,-f]线性映射到[-n,f],除以w后进一步非线性映射到[-1,1]

    透视投影除以w后,视景体的八个角点【视图空间坐标】分别映射到NDC空间中的八个角点,如[r,t,-n,1]映射到[1,1,-1,1],[f*r/n,f*t/n,-f,1]映射到[1,1,1,1]

    正交投影矩阵:

    变换后w=1,Xe,Ye,Ze被线性映射到-1~1,而透视投影是非线性映射,因而有Z-Fighting问题。

    4.应用例子:从深度图重建位置

    延迟渲染,SSR等特效都要求由深度信息重建位置信息,如果深度是归一化过的【0~1非线性】,可以将由纹理坐标uv[画一个全屏Quad],深度z,计算出在NDC中的坐标,然后由投影矩阵逆变换,得到视图空间中的位置,这种情况会有精度损失,因为z是非线性的。解决办法是直接使用视图空间的深度,由uv可以得到NDC中的坐标[a,b,1,1],逆变换到视图空间,得到ray=[a',b',f,1],结合深度d,可以计算出坐标为d/f*ray。

    更多相关内容
  • 为矩阵向量创建 Haar 小波变换矩阵 H Haar小波变换的乘法实现。 此函数使用以下漂亮的公式来创建 Haar 变换矩阵: H_n=1/sqrt(2)[H_(n/2) 克朗 (1 1) I_(n/2) 克朗 (1 -1)], 其中“kron”表示克罗内克积。 迭代从 H_...
  • 生成DCT变换矩阵,对8*8的变换矩阵产生基图像
  • 输入是两帧的位姿放入qw,qc,tw,tc中,记住qw,qc里的第一个参数是TUM GroundTruth里位姿的最后一项,输出是两帧的变换矩阵T,下载就能用。
  • matlab开发-Haar小波变换矩阵化。创建Haar小波变换矩阵
  • 根据自定义的单应变换矩阵,对图像进行单应变换,其实不光是单应变换,通过自己设定变换矩阵H,根据xH=x‘,可以进行任意变换,注意变换矩阵不要设定的太离谱
  • 这是沙威老师关于构造正交小波变换矩阵的matlab实现代码,供大家学习交流。
  • 详解坐标变换矩阵

    万次阅读 多人点赞 2021-12-27 22:54:28
    这是本人第一次在CSDN发文,本文详细总结坐标变换矩阵。 一、何为坐标变换矩阵 首先要回答一个问题,何为坐标变换矩阵呢?在以上所举例的坐标系变换的语境下, “点不变,坐标系进行变换。” 高中就接触到点的...

    在高级驾驶辅助系统(ADAS)领域,存在多种常用的坐标系:LiDAR坐标系、车辆坐标系、相机坐标系、图像坐标系等。在笔者最近的实习过程中,和这些坐标系频繁打交道。作为第一次在CSDN发文,本文将详细总结坐标变换矩阵。


    目录

    1. 何为坐标变换矩阵 (Transformation Matrix)

    2. 旋转变换矩阵(Rotation Matrix)

    3. 缩放变换矩阵(Scale Matrix)

    4. 平移变换矩阵(Translation Matrix)

    5. 综合变换

    6. 小结


    1. 何为坐标变换矩阵 (Transformation Matrix)

    首先要回答一个问题,何为坐标变换矩阵呢?

    “横看成岭侧成峰,远近高低各不同”,这说明了参照系的选取对我们观察事物的重要性。在以上所举例的坐标系变换的语境下,点是客观存在的,而坐标系则是根据不同的应用场景人为选择的。处理pcd点云数据时,需要三维的LiDAR坐标系;查看图像时,需要二维的图像坐标系(通常为1920*1080等尺寸)。即:

    “点不变,坐标系进行变换。”

    坐标变换矩阵,就是在这种变换坐标系的前后,点的数值的变换映射关系矩阵。注意,点不动,坐标系动。下文讨论三种变换矩阵:旋转变换矩阵、缩放变换矩阵和平移变换矩阵。


    2. 旋转变换矩阵(Rotation Matrix

    2.1 二维情形

    如图1所示,在二维平面xoy上,由绿色坐标系逆时针旋转θ°到蓝色坐标系。可以看到,点A是没有移动的,变化的是点A分别在前后两个坐标系中的坐标,即从(x_{g}, y_{g})变换到了(x_{b}, y_{b})

    图1 二维平面旋转矩阵

    如图1中黑色虚线的分解方式所示,通过矢量分解(类似于物理中力、速度等矢量的分解),将绿色坐标系中的(x_{g}, y_{g})分别分解到蓝色坐标系的x轴和y轴上,可以得到:

    \\x_{b} = cos\theta * x_{g} + sin\theta * y_{g} \\ y_{b} = -sin\theta * x_{g} + cos\theta* y_{g}

    用矩阵表示为:

    \begin{bmatrix} x_{b}\\ y_{b} \end{bmatrix} = \begin{bmatrix} cos\theta & sin\theta\\ -sin\theta & cos\theta \end{bmatrix} \begin{bmatrix} x_{g}\\ y_{g} \end{bmatrix}

    其中R则为二维情形下的旋转变换矩阵,它表示了A点在前后坐标系中的值的映射关系

    R = \begin{bmatrix} cos\theta & sin\theta\\ -sin\theta & cos\theta \end{bmatrix}

    2.2 三维情形

    有了上述在二维平面旋转的基础,三维空间的旋转矩阵也就不难得出了。

    即绕x轴,y轴,z轴分别进行旋转。最后将这三个旋转变换矩阵相乘,就能得到在三维空间任意角度的旋转变换矩阵了。(xyz轴满足右手系关系

    绕x轴旋转的时候,可以看作在yoz二维平面上的旋转,此时x的值不变

    R_{x} =\begin{bmatrix} 1 &0& 0\\ 0 &cos\theta &sin\theta \\ 0 &-sin\theta & cos\theta \end{bmatrix}

    绕y轴旋转的时候,可以看作在zox二维平面上的旋转,此时y的值不变

    R_{y} =\begin{bmatrix} cos\theta &0& -sin\theta\\ 0 &1&0 \\ sin\theta &0& cos\theta \end{bmatrix}

    绕z轴旋转的时候,可以看作在xoy二维平面上的旋转,此时z的值不变

    R_{z} =\begin{bmatrix} cos\theta &sin\theta& 0 \\ -sin\theta &cos\theta&0 \\0&0&1 \end{bmatrix}

    最终的三维旋转变换矩阵就是上面三个矩阵相乘,意为三维坐标系分别绕x轴、y轴和z轴旋转相应的角度。

    R = R_{x}R_{y}R_{z} =\begin{bmatrix} 1 &0& 0\\ 0 &cos\theta_{x} &sin\theta_{x}\\ 0 &-sin\theta_{x} & cos\theta_{x} \end{bmatrix}\begin{bmatrix} cos\theta_{y}&0& -sin\theta_{y}\\ 0 &1&0 \\ sin\theta_{y} &0& cos\theta_{y} \end{bmatrix}\begin{bmatrix} cos\theta_{z} &sin\theta_{z}& 0 \\ -sin\theta_{z} &cos\theta_{z}&0 \\0&0&1 \end{bmatrix}

    2.3 顺时针?逆时针?

    在笔者初次接触旋转概念之时,常常对何时顺时针,何时逆时针十分头疼。

    高中就接触到点的旋转矩阵R(rotation matrix of a point),在这种情况下是坐标系不变,点绕坐标原点顺时针旋转 θ°。

    R = \begin{bmatrix} cos\theta & sin \theta\\ -sin\theta & cos \theta \end{bmatrix}

    而在本文的情形下,旋转变换矩阵的形式完全一致,但是方向却相反了——变成了逆时针!究其原因,还是上文老生常谈的那点,高中的矩阵是点动系不动,而本文是系动点不动。因此方向正好相反了。

    回到本文的系动点不动,此时再从两种角度推导出顺时针旋转的公式。

    1)θ变为-θ:此时就是选择了相反的旋转角度,变成顺时针。

    2)求原矩阵的逆矩阵:先逆时针,再顺时针,相当于回到原系,也就是坐标和单位矩阵相乘。

    可以得到,坐标系顺时针旋转θ°的旋转变换矩阵为:

    R = \begin{bmatrix} cos\theta & -sin \theta\\ sin\theta & cos \theta \end{bmatrix}


    3. 缩放变换矩阵(Scale Matrix)

    除了旋转变换,还有坐标数值的纯粹放大缩小变换,即缩放变换。下面直接给出缩放变换的公式:

    S = \begin{bmatrix} Scale.x & 0 & 0\\ 0 & Scale.y & 0 \\ 0 & 0 & Scale.z \end{bmatrix}

    上式中点的x, y, z坐标值分别扩大(缩小)了Scale.x, Scale.y, Scale.z倍。

    缩放矩阵同样存在“系动点不动”还是“点动系不动”的问题。如果是“点动系不动”,那么S矩阵中的Scale.x, Scale.y, Scale.z就是单纯的点x, y, z的扩大(缩小)倍数。

    如果是本文重点探讨的“系动点不动”,那么S矩阵中的Scale.x, Scale.y, Scale.z就是坐标系的x, y, z轴的单位扩大(缩小)倍数的倒数。换言之,如果坐标轴单位放大Scale倍,那么点x, y, z的值就要缩小Scale倍。可以用千米和米的转换来思考这个问题。如果单位是m,一个物体长1000m。当单位变为km后,这个物体就长1km了。单位扩大的同时,数值上从1000缩小为了1。


    4. 平移变换矩阵(Translation Matrix)

    坐标系的旋转和缩放可以通过3*3的变换矩阵完成,但是平移就需要将3*3扩展到4*4,引入齐次变换矩阵。下面直接给出平移变换矩阵的公式:

    T = \begin{bmatrix} 1 & 0 & 0 & Translation.x \\ 0 & 1 & 0 & Translation.y \\ 0 & 0 & 1 & Translation.z\\ 0 & 0 & 0 & 1 \end{bmatrix}

    具体过程即:

    \begin{bmatrix} x+Translation.x\\ y+Translation.y\\ z+Translation.z\\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & Translation.x \\ 0 & 1 & 0 & Translation.y \\ 0 & 0 & 1 & Translation.z\\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}

    平移矩阵同样存在“系动点不动”还是“点动系不动”的问题。

    如果是本文重点探讨的“系动点不动”。如果系向左(x轴负方向)/后(y轴负方向)/下(z轴负方向)平移,那么T矩阵中的Translation.x, Translation.y, Translation.z为正;如果系向右(x轴正方向)/前(y轴正方向)/上(z轴正方向)平移,那么T矩阵中的Translation.x, Translation.y, Translation.z为负。可以借助爬楼梯来理解,小明在地面抬头看着5楼,五楼相当于+5。当小明爬到5楼的时候,此时五楼相当于0了。小明爬到10楼的时候,此时五楼就相当于-5了。小明就是坐标系的原点,5楼就是不动的一个点。


    5. 综合变换

    将变换矩阵和点向量全部齐次化:

    R = R_{x}R_{y}R_{z} = \begin{bmatrix} 1 &0& 0 & 0\\ 0 &cos\theta_{x} &sin\theta_{x}& 0\\ 0 &-sin\theta_{x} & cos\theta_{x} & 0\\0&0&0&1\end{bmatrix} \begin{bmatrix} cos\theta_{y}&0& -sin\theta_{y}& 0\\ 0 &1&0& 0 \\ sin\theta_{y} &0& cos\theta_{y}& 0\\0&0&0&1 \end{bmatrix} \begin{bmatrix} cos\theta_{z} &sin\theta_{z}& 0& 0 \\ -sin\theta_{z} &cos\theta_{z}&0& 0 \\0&0&1 & 0\\0&0&0&1\end{bmatrix}

     S = \begin{bmatrix} Scale.x & 0 & 0& 0\\ 0 & Scale.y & 0 & 0\\ 0 & 0 & Scale.z & 0\\0& 0&0&1\end{bmatrix}

    T = \begin{bmatrix} 1 & 0 & 0 & Translation.x \\ 0 & 1 & 0 & Translation.y \\ 0 & 0 & 1 & Translation.z\\ 0 & 0 & 0 & 1 \end{bmatrix}

    A = \begin{bmatrix} x& y& z& 1 \end{bmatrix}^{T}

    那么此时,对于不动点,如果按照“旋转-缩放-平移”的顺序变换坐标系后,此点的值产生如下变换:

    {A}' = TSRA


    6. 小结

    ADAS中涉及多种坐标系的变换,点的坐标会随着坐标系的变换而变化。坐标变换矩阵就是在坐标系变换前后,点的数值的映射关系矩阵。主要有旋转变换矩阵、缩放变换矩阵和平移变换矩阵等。极其重要和容易混淆的是,在具体的应用场景中,是什么在变,什么不变,是系还是点。矩阵的具体实现可以采用python中的numpy模块。

    展开全文
  • Unity3D C#数学系列之变换矩阵推导

    千次阅读 2021-12-26 09:26:23
    三维空间中,只要是仿射变换,就可以用一个4×4的变换矩阵来表示。 但是为什么变换矩阵一定是4×4的呢,3×3行不行?答案是不行。如果不考虑点的平移,只考虑向量或点的旋转、缩放,3×3的矩阵就可以了。但如果考虑...


    1 仿射变换与齐次坐标

    《Unity3D C#数学系列之矩阵基础》中我们说到一个4×4的矩阵可以用来对三维空间中的点或向量进行各种变换,包括平移、旋转、缩放(当然还有错切、镜像等,由于我工作中这几种从来没用过,所以这里就不说这两种变换了)以及这几种变化的组合。这些变换有一个统一的名字,叫做仿射变换。三维空间中,只要是仿射变换,就可以用一个4×4的变换矩阵来表示。
    但是为什么变换矩阵一定是4×4的呢,3×3行不行?答案是不行。如果不考虑点的平移,只考虑向量或点的旋转、缩放,3×3的矩阵就可以了。但如果考虑点的平移,3×3的矩阵就不满足要求了,必须扩充到4×4。至于为什么3×3无法表示平移,下面我们推导平移矩阵的时候就知道答案了。
    我们知道三维空间中,一个点或者向量用3个变量x,y,z来表示就行了,但是在进行矩阵变换的时候,需要增加一维变量w。用(x, y, z, w)表示的向量或点,就叫齐次坐标。向量的w分量为0,点的w分量为1(为0时可以忽略掉平移的效果,如向量平移后还是它本身,为1时会保留平移的效果)。

    2 变换矩阵的推导

    2.1 变换矩阵推导一般过程

    设4×4的变换矩阵为 M \textbf{M} M4×4
    变换矩阵
    设一个点A变换前的坐标为(x,y,z,w),变换后的点A’ 坐标为(x’,y’, z’,w’),则有
    (还记得为什么点或向量的坐标要写成列矩阵的的形式吗,不记得了去看看上一篇文章)
    变换矩阵推导的一般过程
    矩阵乘法展开后就有方程组
    矩阵乘法展开
    我们上面说过,点的齐次坐标的w分量为1,所以又有
    矩阵乘法展开
    从上面方程组中的最后一个方程我们可以看出(无论x、y、z为何值都满足这个方程), m \textbf{m} m41 m \textbf{m} m42 m \textbf{m} m43全部等于0, m \textbf{m} m44等于1。
    变换矩阵的一般推导过程
    然后,我们令A(x,y,z,1)分别为(1, 0, 0, 1),(0,1,0, 1),(0,0,1, 1)同时我们需要分析出对应变换后的坐标A’(x’,y’, z’,1),然后代入上面的方程组的前3个,一般就能推导出平移、旋转、缩放的矩阵了。

    2.2 平移矩阵

    设点A(x,y,z,1)平移(a,b,c,0)(即在x轴方向平移a个单位,y方向平移b个单位,z方向平移c个单位),则A’点的坐标为(x + a,y + b,z + c,1),代入上面的方程组中有
    平移矩阵的推导
    无论x、y、z为何值都满足上面方程组中的各个方程,必然有
    平移矩阵的推导
    所以平移的变换矩阵为
    平移矩阵
    平移矩阵的逆矩阵如下:
    平移矩阵的逆矩阵
    如果我们用一个3×3的矩阵来进行平移变换,将方程组展开,会发现根本没有解。所以3×3的矩阵无法表示平移,但4×4的矩阵可以。其根本原因是因为平移不是线性变换,必须要扩展一维才可以
    3×3矩阵无法表示平移变换

    2.3 缩放矩阵

    2.3.1 沿坐标轴的缩放

    设向量(x,y,z,0)沿坐标轴缩放(kx,ky,kz,0),则缩放后的坐标为(kxx,kyb,kzz,0),代入2.1中的方程组中有
    沿坐标轴的缩放矩阵
    显然有
    沿坐标轴的缩放矩阵
    所以沿坐标轴缩放(kx,ky,kz)的缩放矩阵为
    沿坐标轴的缩放矩阵
    其逆矩阵为如下:
    沿坐标轴的缩放矩阵的逆矩阵

    2.3.2 沿任意轴的缩放

    设向量 v ⃗ \vec{v} v (x,y,z,0)沿单位向量 n ⃗ \vec{n} n (nx,ny,nz,0)缩放k个单位,假设缩放后的坐标为 v ′ ⃗ \vec{v'} v (nx,ny,nz,0),现在我们要求缩放矩阵,必须先把 v ′ ⃗ \vec{v'} v 给求出来。
    我们将 v ⃗ \vec{v} v 分为两个部分,一个是 v ⃗ \vec{v} v ,其垂直于 n ⃗ \vec{n} n ,沿着 n ⃗ \vec{n} n 缩放将对其不产生任何影响;另一个是 v ⃗ \vec{v} v //,其平行于 n ⃗ \vec{n} n ,沿着 n ⃗ \vec{n} n 缩放将对其产生影响。
    沿任意轴的缩放
    沿任意轴缩放的推导01
    由于 v ⃗ \vec{v} v //平行于 n ⃗ \vec{n} n ,则有 v ⃗ \vec{v} v // = ( v ⃗ \vec{v} v · n ⃗ \vec{n} n ) n ⃗ \vec{n} n
    所以 v ⃗ \vec{v} v //沿着 n ⃗ \vec{n} n 缩放k个单位后的值为k( v ⃗ \vec{v} v · n ⃗ \vec{n} n ) n ⃗ \vec{n} n
    又由于 v ⃗ \vec{v} v ⃗垂直于 n ⃗ \vec{n} n ,所以 v ⃗ \vec{v} v ⃗沿着 n ⃗ \vec{n} n 缩放k个单位后的值仍为 v ⃗ \vec{v} v = v ⃗ \vec{v} v - v ⃗ \vec{v} v // = v ⃗ \vec{v} v -( v ⃗ \vec{v} v · n ⃗ \vec{n} n ) n ⃗ \vec{n} n
    于是
    沿任意轴缩放的推导02
    v ⃗ \vec{v} v =(x,y,z), n ⃗ \vec{n} n =(nx,ny,nz )代入有,
    沿任意轴缩放的推导03
    代入2.1中的方程组中有
    沿任意轴缩放的推导04
    于是
    沿任意轴缩放的推导05
    所以沿单位向量 n ⃗ \vec{n} n (nx,ny,nz)缩放k个单位的缩放矩阵为
    沿任意轴缩放k个单位的缩放矩阵

    2.4 坐标系之间的变换

    在推导旋转矩阵之前,我们先看看不同坐标系之间的变换矩阵是怎么推导的,这是推导旋转矩阵的基础。
    我们在说一个点或者一个向量的坐标的时候,一定要知道这个坐标是在什么坐标系下的。
    我们在说一个点或者一个向量的坐标的时候,一定要知道这个坐标是在什么坐标系下的。
    我们在说一个点或者一个向量的坐标的时候,一定要知道这个坐标是在什么坐标系下的。
    只要说到坐标,一定要立马想到这个坐标所在的坐标系
    同一个点或者同一个向量,在不同坐标系下,它们的坐标值是不一样的。所以我们这里才会来求不同坐标系之间的变换矩阵。
    这里先直接给出结论:
    坐标系之间的变换
    具体推导过程如下。
    变换矩阵的推导
    我们在上一篇文章《Unity3D C#数学系列之矩阵基础》中说过逆矩阵可以用来还原某种变换或者说反变换,且正交矩阵的逆矩阵就是其转置矩阵。并且,由标准正交基(长度为1的坐标系的x、y、z轴向量)构成的矩阵其实就是正交矩阵。
    而对于向量,无论怎么平移,向量的值都是不变的,所以对于向量其变换矩阵使用3×3就足够了。那么对于向量,坐标系O’x’y’z’到Oxyz的变换矩阵也可求到了,如下。
    坐标系变换矩阵的逆矩阵

    2.5 旋转矩阵

    2.5.1 二维平面中的旋转

    我们先来看二维平面上的旋转。在二维平面上,我们说的旋转是指绕着某一个点旋转
    说一条线绕着某一点(假设名字为旋转中心)旋转,是指该线上的所有点绕着旋转中心旋转。
    说一个多边形绕着某一点(假设名字为旋转中心)旋转,是指这个多边形上的每一个点绕着旋转中心旋转。

    2.5.1.1 绕原点的旋转

    我们先来推导下二维平面Oxyz坐标系中,绕原点O旋转的旋转矩阵。
    二维平面的旋转
    设坐标系Oxyz是左手坐标系(因为Unity中世界坐标系和局部坐标系都是左手坐标系,所以我们这里举例子也按照Unity的来),A点绕着原点O旋转了θ度到达新点A‘,求旋转矩阵。
    推导过程如下。
    绕原点旋转的变换矩阵推导
    绕原点的旋转矩阵推导
    旋转矩阵是正交矩阵
    (还记得正交矩阵满足什么条件吗?忘记了去复习一下《Unity3D C#数学系列之矩阵基础》第4.4节)
    所以其逆矩阵就是其转置矩阵。
    旋转矩阵的逆矩阵

    2.5.1.2 绕任意点的旋转

    如图,左手坐标系Oxyz中,B点在Oxyz坐标系的坐标为(a, b),求A点绕点B旋转θ角的旋转矩阵。
    二维平面绕任意点的旋转
    其推导过程如下:
    二维平面绕任意点的旋转矩阵推导过程

    2.5.2 三维空间中的旋转

    三维空间说的旋转是指一个点或者一个向量绕着某一个方向或者说某一个轴旋转(二维是绕着某一个点)。

    2.5.2.1 绕x轴的旋转

    如图,A点绕X轴旋转θ度后到达A‘点(我们这里还是假设Oxyz坐标系是左手坐标系的)。
    绕X轴的旋转
    绕着X轴旋转其实可以理解在Oyz这个二维平面内绕着原点O进行旋转。然后将A’点和A点的x轴坐标设置为一样的。
    上面这句话可能没表达清楚,看下面这张图应该就能理解了,其中灰色平面与Oyz平面平行。
    三维空间绕X轴的旋转
    根据上一节我们讲的二维平面中绕原点的旋转矩阵,咱们可以直接写出三维空间中绕x轴的旋转矩阵。
    三维空间绕x轴旋转θ的旋转矩阵

    2.5.2.2 绕y轴的旋转

    同绕x轴的旋转,绕着y轴的旋转可以理解为在Oxz这个二维平面内绕着原点O进行旋转。然后将A’点和A点的y轴坐标设置为一样的。
    绕y轴的旋转
    绕y轴旋转θ角的旋转矩阵为
    绕y轴旋转θ角的旋转矩阵

    2.5.2.3 绕z轴的旋转

    同绕x轴的旋转,绕着z轴的旋转可以理解为在Oxy这个二维平面内绕着原点O进行旋转。然后将A’点和A点的z轴坐标设置为一样的。
    绕z轴旋转θ角的旋转矩阵
    绕z轴旋转θ角的旋转矩阵为
    绕z轴旋转θ角的旋转矩阵

    2.5.2.4 绕任意轴的旋转

    如图,Oxyz坐标系中,A点绕向量 r ⃗ {\vec{r}} r =(a,b,c)旋转θ度到达A’点,求旋转矩阵。
    绕任意轴的旋转
    绕任意轴的旋转与二维平面的旋转推导方法类似的,关键在建立一个辅助坐标系。
    其推导过程如下:
    绕任意轴的旋转矩阵推导
    后面我实在是不想算了,要用的时候直接查资料吧。。。


    博主本文博客链接。


    展开全文
  • 关于仿射变换矩阵的一点理解

    千次阅读 2022-04-08 09:21:30
    变换形式如下,a0, a1, a2, b0, b1,b2是对应2*3变换矩阵的几个值。 针对图像而言,变换矩阵和图像之间关系为:dst_img=M*src_img 仿射变换有如下几种变换形式:平移、旋转、放缩、剪切、翻转。 为了涵盖平...

    仿射变换,是一种二维坐标到二维坐标之间的线性变换;它保持了二维图形的“平直性”(直线经过变换后依然是直线)和“平行性”(二维图形之间相对位置保持不变,平行线依然是平行线,且直线上点的位置关系不变)。仿射变换可以写为如下形式。

    变换形式如下,a0, a1, a2, b0, b1,b2是对应2*3变换矩阵的几个值。

    针对图像而言,变换矩阵和图像之间关系为:dst_img=M*src_img

    仿射变换有如下几种变换形式:平移、旋转、放缩、剪切、翻转。

            为了涵盖平移,将变换矩阵引入齐次坐标,在原有二维基础上增加一个维度,如下:

    不同的基础变换,a,b,c,d,e,f约束不同,可以有如下几种,a,b,d,e主要控制x,y的旋转,缩放指标,c,f 则是控制是否平移的指标。比如当c,f不为0时候,表示原图左下角坐标(h1,w1)平移变成了(h1+y, w1+x)。当a,b,d,e 分别是1,0,0,1时候,表示原图尺寸不变,如果变成了 w2, 0, 0, h2,则表示原图的height和width分别re_scale了H,W倍。

    借助opencv, 一张图像的仿射变换求解流程:

    1,给出图像上三个点的坐标,以及仿射变换后对应的这三个点的坐标

    2,利用M=cv2.getAffineTransform(src_point,dst_point)得到转换矩阵M

    3,利用dst= cv2.warpAffine(img,M,(new_width,new_height))得到转换后的图像。其中img是原图,(new_width,new_height)是转换后的图像尺寸。

    另外一种方法,根据如上图的自定义的仿射变换结果,直接给出M矩阵,求解仿射后图像的方法。

    比如,想通过仿射变换实现将一张图resize成小点的尺寸,使用两种方法的对比代码如下:

    # -*- coding: utf-8 -*-
    
    import cv2
    import numpy as np
    
    img = cv2.imread('test.jpg')
    # img=cv2.resize(img,(250,300))
    height, width = img.shape[:2]
    
    new_height=220
    new_width=180
    print("ori:%d,%d, new: %d, %d"%(height,width,new_height,new_width))
    scale=min(new_height/height,new_width/width)
    M1=np.array([[scale, 0, 0],
                 [0,scale, 0]])
    iM1=cv2.invertAffineTransform(M1)#逆矩阵,可反向由dst*iM1求得src
    
    dst1=cv2.warpAffine(img,M1,(new_width,new_height))
    new_dst=np.zeros([height,width,3]).astype(np.uint8)
    new_dst[:new_height,:new_width,:]=dst1
    img1 = np.hstack([img,new_dst])
    
    src_point=np.float32([[0,0],[0,height],[width,0]])
    dst_point=np.float32([[0,0],[0,new_height],[new_width,0]])
    M2=cv2.getAffineTransform(src_point,dst_point)
    dst2=cv2.warpAffine(img,M2,(new_width,new_height))
    new_dst1=np.zeros([height,width,3]).astype(np.uint8)
    new_dst1[:new_height,:new_width,:]=dst2
    img2 = np.hstack([img,new_dst1])
    img3=np.hstack([img1,img2])
    cv2.imshow("M2",img3)
    cv2.waitKey(0)
    
    '''
    # 在原图像和目标图像上各选择三个点
    mat_src = np.float32([[0, 0],[0, height-1],[width-1, 0]])
    mat_dst = np.float32([[0, 0],[100, height-100],[width-100, 100]])
    # 得到变换矩阵
    mat_trans = cv2.getAffineTransform(mat_src, mat_dst)
    # 进行仿射变换
    dst = cv2.warpAffine(img, mat_trans, (width,height))
    
    # 显示
    imgs = np.hstack([img,dst])
    cv2.namedWindow('imgs', cv2.WINDOW_NORMAL)
    cv2.imshow("imgs",imgs)
    cv2.waitKey(0)
    '''

    两种方法对比如下,左边是直接定义M,右边是通过两组图的三个对应点求M的方式,所有的左边是原图,右边是仿射处理后的图。

    透射变换

    透视变换的API和仿射变换的API很像,原理也相同,不同的只是由之前的三点变为四点法求透视变换矩阵,变换矩阵也由2*3变为3*3

    M = cv2.getPerspectiveTransform(src_points, dst_points)
    im_dst= cv2.warpPerspective(im_src, M, dsize = (w,h), flags = cv2.INTER_LINEAR)

    参考:仿射变换及其变换矩阵的理解 - shine-lee - 博客园

    OpenCV: Geometric Image Transformations

    展开全文
  • 本文介绍了组合(也称复合)仿射变换的概念、变换过程以及变换矩阵,并以绕指定点旋转的组合变换、指定直线作为依赖轴的组合变换详细介绍了变换过程和变换矩阵的构成,有助于深入理解仿射变换的概念和处理过程。
  • 【OpenGL】二十、OpenGL 矩阵变换 ( 矩阵缩放变换 | 矩阵旋转变换 | 矩阵平移变换 ) https://hanshuliang.blog.csdn.net/article/details/112859256 博客源码 ( 该源码是 Windows 桌面程序 , 使用 Visual Studio ...
  • 本文介绍了仿射变换的类型及其关系以及仿射变换矩阵,基本的仿射变换包括平移、旋转、缩放和错切,镜像可以看做特殊的缩放。实际中一般图像的仿射变换就是平移、旋转、缩放和错切的叠加组合,每叠加一个处理,就进行...
  • 仿射变换矩阵

    千次阅读 2022-04-19 10:58:39
    首先总结而言:仿射变换矩阵实际上就是:平移向量+旋转变换组合而成,可以同时实现旋转,缩放,平移等空间变换。 Eigen库中,仿射变换矩阵的大致用法为: 创建Eigen::Affine3f 对象a。 创建类型为Eigen::Translation...
  • 本文主要是计算两个激光雷达之间的变换矩阵,即计算两组点云之间的变换矩阵。其中处理的点云数据主要是由x,y,z,intensity组成的,代表空间位置x,ry,z 和每个点云对应的反射强度intensity; 这里计算点集之间的变换...
  • 图像线性变换是仿射变换的子集,包括图像的旋转、错切、缩放以及几者的组合叠加,...所有图像线性变换都可以使用图像变换矩阵和图像平面空间向量的乘积来表示,本文分析了图像线性变换的代数表示方法以及对应变换矩阵
  • MATLAB 函数查找以方程形式给出的线性变换矩阵表示。 详细阅读评论部分。
  • 仿射变换和透视变换矩阵的参数含义与区别

    千次阅读 多人点赞 2020-11-16 16:22:30
    从直观的角度看,仿射变换和透视变换的最大区别是:一个平行四边形,经过仿射变换后... 所以,仿射= 旋转 + 平移 仿射变换矩阵为: 其中,(x,y)是原图坐标,(x’,y’)是变换后的坐标;m11,m12,m21,m22为旋转量,m13,
  • 3D变换矩阵的分解公式

    千次阅读 2021-11-11 00:31:21
    3D变换矩阵:平移、缩放、旋转3D变换矩阵是一个4x4的矩阵,即由16个实数组成的二维数组,在三维空间中,任何的线性变换都可以用一个变换矩阵来表示。本文介绍从变换矩阵中提取出平移、缩放、旋...
  • 齐次变换矩阵的三种解读2.1 坐标系表示2.2 坐标系变换2.3 点的操作算子3. 解决问题3.1 齐次变换矩阵的逆3.2 多重变换时的顺序4. 总结 1. 引言   上一篇文章我们讲到了齐次变换矩阵,表面上看我们得到了一个十分...
  • 基于OpenCV的二维矩阵刚性变换(旋转,平移),已知两点集,求解R&T变换矩阵,其中自定义接口,已经赋初值,可以更改调用
  • Unity变换矩阵之如何构建变换矩阵

    千次阅读 2017-12-20 12:48:21
    变换矩阵包括:平移、旋转、缩放。 平移矩阵: 旋转矩阵: 缩放矩阵: 变换矩阵,就是将一个向量一次进行 平移、旋转和缩放变换,由此可得变换矩阵为 应用: 1:进行向量的坐标系变换  已知模型空间下的...
  • 仿射变换及其变换矩阵的理解

    千次阅读 多人点赞 2019-05-30 17:35:11
    文章目录写在前面仿射变换:平移、旋转、放缩、剪切、反射变换矩阵形式变换矩阵的理解与记忆变换矩阵的参数估计参考 写在前面 2D图像常见的坐标变换如下图所示: 这篇文章不包含透视变换(projective/perspective ...
  • 机器人的数学基础齐次变换矩阵及其运算
  • 6. 机器人正运动学---齐次变换矩阵的三种解读

    万次阅读 多人点赞 2020-02-13 23:27:54
    这篇文章介绍了我们可以从三个不同的角度理解齐次变换矩阵。利用这三种解读可以帮助我们轻松地去理解一些齐次变换过程,特别是齐次变换矩阵的乘法顺序问题。
  • 坐标系变换矩阵推导

    千次阅读 2021-01-18 11:54:29
    1.平移变换 2.旋转变换 由固定坐标系旋转到另一个坐标系。
  • 求若当标准型的变换矩阵

    千次阅读 多人点赞 2020-11-19 14:52:29
    但在这里掐指一算就知道了,因为只有 2 是二重根 下面要求变换矩阵 P P P 使得: A = P J P − 1 ⇔ A P = P J ⇔ A [ p 1 p 2 p 3 ] = [ p 1 p 2 p 3 ] [ 2 0 0 1 2 0 0 0 4 ] ⇔ { A p 1 = 2 p 1 + p 2 A p 2 = 2 ...
  • 齐次变换矩阵的逆矩阵的求解

    千次阅读 2021-01-13 10:31:53
    已知坐标系 AAA 相对于坐标系 BBB 的齐次变换矩阵为 TABT_{A}^{B}TAB​,有时在求解问题时需要依据 TABT_{A}^{B}TAB​ 求取坐标系 BBB 相对于坐标系 AAA 的齐次变换矩阵 TBAT_{B}^{A}TBA​ ,这个问题可以简单的描述...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 208,313
精华内容 83,325
关键字:

变换矩阵