- 博客(41)
- 收藏
- 关注
原创 10. 直线应用:2. 计算点是到直线上的距离
假设直线由点 A 和 B 定义,点 P 是直线外的一点。向量 AB 和 AP 的叉积的绝对值除以 AB 的长度即为点到直线的距离。点到线段的距离需要考虑点 P 是否在线段 AB 的投影范围内。如果 P 在 AB 的投影范围内,则使用点到直线的距离公式;判断 P 是否在线段 AB 上的投影范围内,可以通过点积来实现。AB×AP的模长是平行四边形的面积,PO*|AB|也是平行四边形的面积。由此可以判断AB 和 AP的夹角在π/2 ~ π2/3之间,为负值,则证明P在A的反向延长线上。
2025-05-29 11:48:59
223
原创 9. 直线应用:1. 判断点是否在直线上
当PA 与 PB的夹角为0°或者180°,sin(θ) = 0,PA×PB=0;当角度为π的整数倍时,sin(θ) = 0;判断点是否在线段上,就只需要,多判断一个点积(a · b = |a| |b| cosθ),如果PA和PB的夹角为180,则计算结果<0(因为cos π = -1);在计算上,满足叉积=0,则在直线上,再加上计算点积是否<0, 则可以判断是否在AB之间。如果点积=0,则点P在在点A或者点B上。点和直线有两种位置关系,不在直线上(左图)或者 在直线上(右图),可以利用叉积去计算。
2025-05-29 11:41:07
213
原创 8. 直线基础知识
在计算机中,特别是计算机图形学中,点向式(参数方程形式)是表示直线的常用方法。在二维平面或三维空间中,每个点都有其坐标,我们可以利用这些坐标来表示向量。二维平面中的表示:假设点 A的坐标为(x1,y1),点 B 的坐标为(x2,y2)。这里,t 是一个在[0, 1]区间内的参数。当t = 0时,P等于A;当t在(0, 1)区间内时,P是线段AB 上的一个内点。那么,向量 AB可以表示为 (B-A)(x2-x1, y2-y1);这里,P0 是直线上的一个点,v 是直线的方向向量,t 是参数。
2025-05-29 11:35:09
288
原创 7. 凸包问题
凸包是指在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。简单来说,凸包是一个最小凸多边形(或多面体),它能包含点集X中的所有点,且这些点要么在多边形的边上,要么在其内部。下图中,蓝色包围框就是一个凸包。
2025-05-29 11:31:50
572
原创 4. 两条直线的位置关系以及交点值
所以,如果两个向量的叉乘的模长为0,则这两个向量平行。两个向量 a 和 b 的叉乘 a×b 是一个垂直于 a 和 b 所构成的平面的向量,其模长 ∣a×b∣ 等于 ∣a∣⋅∣b∣⋅sinθ,其中 θ 是 a 和 b 之间的夹角。给定四个点,前两个点是直线L1上的两点,后两个点是直线L2上的两点。在平行的条件下,P1,P2,P3 组成的两条直线如果叉积为0的话,则说明P1,P2,P3在一条直线,进而说明共线。这样,我们就完成了从两点式方程到一般式方程的转换,并得出了一般式方程中各个参数的表达式。
2025-05-29 11:11:08
667
原创 3.C++实现2D凸多边形碰撞检测算法(SAT分离轴碰撞)
分离轴是一个向量,可以理解为一条平行于多边形边的线(或其法线方向)。在二维空间中,分离轴通常是一条直线,它将两个形状分开,使得它们在这条直线上的投影没有重叠部分。从下图可以看出,左边的两个矩形没有发生碰撞,中间的分离轴将其分隔开来,而右边的两个矩形发生碰撞,找不到一条直线将其分割。那么对于这两种情况,我们应该怎么去判断呢?
2025-05-29 10:55:42
899
原创 2.判断两个矩形框是否有重叠
判断两个矩形框(不包括旋转)是否有重叠,可以通过比较它们的边界来确定。在水平方向上,矩形A和矩形B的投影有交集。在垂直方向上,矩形A和矩形B的投影有交集。两个矩形重叠的条件是:它们在水平方向(x轴)和垂直方向(y轴)上都有交集。矩形框1:左上角坐标 (x1,y1),右下角坐标 (x2,y2)矩形框2:左上角坐标 (x3,y3),右下角坐标 (x4,y4)如果这两个方向上的重叠条件都满足,那么两个矩形就是重叠的。
2025-05-29 10:46:46
235
原创 1. 图形学中的基本变换
什么是线性变换,前面提到的变换都可以使用以下表达式表示都可以使用矩阵形式表示为继而表示为:输出坐标 = 变换矩阵 × 输入坐标 的形式满足以上条件的变换称为线性变换。
2025-05-29 10:39:38
620
原创 30、一文深入理解相机成像模型 Zc = 1 的含义?
在视觉里程计中,Zc = 1 的假设是一种理论上的简化,帮助在归一化的条件下理解和计算相机的运动。这种设定将相机坐标系中的深度固定为 1,可以帮助简化计算和理解投影过程,因为在这种情况下,三维点的投影依赖于 (X) 和 (Y) 的坐标,而深度 (Z) 被设为 1,这使得我们可以忽略深度对投影的影响,从而简化计算。在某些情况下,Zc = 1的假设可以作为初步标定的起点,后续可以通过更复杂的模型和方法来细化标定结果,考虑实际深度的变化。当 Zc = 1 时,意味着场景中的点到相机焦平面的距离是单位距离。
2025-05-28 14:28:44
627
原创 29、一文介绍视觉图像处理中的针孔相机畸变模型和鱼眼相机畸变模型
鱼眼镜头生产过程中不可能精确地按照投影模型来设计,所以为了方便鱼眼相机的标定,Kannala-Brandt 提出了一种鱼眼相机的一般多项式近似模型。通过前面四个模型,可以发现θd是入射角θ的奇函数,将这些式子按泰勒级数展开,发现θd用θ的奇次多项式表示,即。根据投影函数的不同将鱼眼相机的设计模型大致分为等距投影模型、等立体角投影模型、正交投影模型和体视投影模型四种。这种模型可以通过θ得到θd,通过无畸变图像中的点能够计算出鱼眼图像中的畸变点。因此,鱼眼相机的畸变系数是k0,k1,k2,k3,k4.
2025-05-28 14:06:08
362
原创 29、一文简要介绍相机成像过程中的坐标系
不管是针孔相机模型,还是鱼眼相机模型,其成像过程都涉及到四个坐标系:世界坐标系、相机坐标系、图像物理坐标系、图像像素坐标系以及这四个坐标系间的转换。原点是相机光轴与平面的交点(称为主点),即图像的中心点,X轴、Y轴分别与u轴、v轴平行。一般在图像处理中,相机坐标系以相机的光轴为原点,前为Z轴,右为X轴,下为Y轴。dx和dy表示感光芯片CMOS或CCD上像素的实际大小,是连接像素坐标系和真实尺寸坐标系的,u0,v0是图像平面中心。世界坐标系以空间中某一点作为世界坐标系原点,建立的坐标系。
2025-05-28 13:58:47
698
原创 28、一文详细分析鱼眼相机成像模型和畸变模型
鱼眼相机的投影函数是为了尽可能将庞大的场景投影到有限的图像平面所设计的。鱼眼镜头是由十几个不同的透镜组合而成的,在成像过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比拥有更大的视野。为了将尽可能大的场景投影到有限的图像平面内,鱼眼相机将相机畸变列为其成像特征用以在有限的图像平面内表达本应落在无穷远处的空间点投影。鱼眼镜头设计采用非相似性成像,在成像过程中引入畸变,引入畸变的作用是通过对直径空间的压缩,突破成像视角的局限,从而达到广角成像。
2025-05-28 13:42:20
899
原创 27、一文简要介绍鱼眼镜头/相机投影成像过程
然而,由于鱼眼相机的大径向畸变,标准算法不容易扩展到环视鱼眼图像上,因此需要专门的处理方法来应对这些挑战。鱼眼镜头是一种短焦距、超广角的特殊镜头,视场角度为180度到270度,它的视觉效果类似于鱼在水中观察水面上的景物。鱼眼镜头的设计与制造基于光的折射原理,外观跟鱼的眼睛很像,因此叫做“鱼眼镜头”,鱼眼镜头拍摄的图像为鱼眼图像。在整个鱼眼相机成像过程中,主要涉及到4个坐标系:世界坐标系XYZ,相机坐标系XcYcZc,图像物理坐标系xy(单位mm)和图像像素坐标系uv(单位pixel)。
2025-05-28 11:51:21
246
原创 26、运动位姿的线性插值 Pose Interpolation
假设有两个位姿 ( P0 ) 和 ( P1 ),其中 ( P0 = (T0, R0) ) 和 ( P1 = (T1, R1) ),( T0 ) 和 ( T1 ) 分别是位置向量,( R0 ) 和 ( R1 ) 分别是旋转表示(例如,四元数)。
2025-05-28 11:38:55
376
原创 25、三维旋转公式
在三维空间中,旋转可以围绕三个坐标轴(x轴、y轴、z轴)进行。每个轴的旋转都可以用一个特定的旋转矩阵来表示。在三维空间中,任意的旋转可以通过这三个基本旋转的组合来实现。例如,一个常见的旋转顺序是先绕z轴旋转,然后绕y轴旋转,最后绕x轴旋转(即ZYX顺序)。这是因为,绕y轴逆时针旋转的时候,旋转方向是z–>x。三维旋转矩阵在计算机图形学、机器人学、航空航天等领域中有着广泛的应用,用于描述和实现三维空间中的旋转变换。其中,(α)、(β) 和 (γ) 分别是绕x轴、y轴和z轴的旋转角度。这里角度都是逆时针旋转。
2025-05-28 11:30:44
273
原创 24、二维旋转公式
在二维空间中,旋转一个点或向量可以通过一个简单的旋转矩阵来实现。这里,点 O (x0, y0) 是圆心坐标,点 P (x, y) 是旋转前坐标,(x’, y’) 是旋转后的新坐标。
2025-05-28 11:20:23
311
原创 23、旋转角度的正负方向约定
总之,绕x轴的旋转可以通过右手定则和观察方向来确定旋转的正负,这是数学、物理和工程领域中广泛接受的惯例。将右手的食指指向x轴的正方向,然后弯曲您的手指,使其指向旋转的方向。在三维空间中,旋转的方向通常由旋转轴和旋转的顺序(如绕x轴、y轴、z轴的顺序)来确定,这在四元数和旋转矩阵的表示中尤为重要。在进行多个轴的旋转时,旋转的顺序会影响最终的旋转结果。例如,先绕x轴旋转再绕y轴旋转,与先绕y轴旋转再绕x轴旋转,通常会得到不同的结果。相反,如果您从x轴的正方向观察时,旋转是顺时针的,那么这个旋转被认为是负的。
2025-05-22 18:06:32
394
原创 22、三维刚体运动中变换矩阵的逆
逆变换矩阵可以用来将一个点或物体从变换后的空间坐标转换回原始坐标。这在许多应用中非常有用,如计算机图形学中的视图变换、机器人学中的路径规划和逆运动学,以及物理模拟中的碰撞检测和响应。在三维空间中,刚体运动可以通过变换矩阵(通常是一个4x4矩阵)来表示,这个矩阵包括旋转和平移部分。变换矩阵的逆可以用来逆转这个变换,即将物体从目标位置变换回原始位置。在三维刚体运动中,变换矩阵的逆可以通过取旋转矩阵的转置和调整平移向量来获得。旋转矩阵 ( R ) 的逆等于其转置,因为旋转矩阵是正交矩阵。
2025-05-22 18:01:03
169
原创 21、四元数 Quaternion
四元数由于其独特的表示方式,可以有效地避免万向锁(Gimbal Lock)问题,这是在使用欧拉角表示旋转时可能遇到的问题。每个四元数都对应一个唯一的旋转,不存在两个不同的四元数表示相同的旋转。四元数可以进行平滑的插值和融合操作,这在动画和游戏开发中非常有用,可以实现平滑的旋转效果。非单位四元数可以通过归一化转换为单位四元数,这在处理三维空间的旋转时非常有用。四元数成为数学史上第一个非交换代数,它引发了代数学的一次解放,并打开了现代抽象代数的大门,是数学史上的一个里程碑。四元数是复数的不可交换延伸。
2025-05-22 17:53:10
777
原创 20、C++ 线性拟合函数实现
在 C++ 中实现线性拟合(Linear Fit),可以通过最小二乘法(Least Squares Method)来计算最佳拟合直线的斜率和截距。以下是一个完整的线性拟合函数实现,包括输入数据点、计算斜率和截距,并输出拟合结果。给定一组数据点 (xi, yi),线性拟合的目标是找到一条直线 (y = mx + b),使得误差平方和最小。通过最小二乘法实现线性拟合,可以计算出最佳拟合直线的斜率和截距。
2025-05-22 17:38:15
347
原创 19、海森矩阵 Hessian
其中 ( i ) 和 ( j ) 是变量的索引,表示函数对变量 ( xi ) 和 ( xj ) 进行求导两次得到的结果。
2025-05-15 10:44:57
636
原创 18、雅可比矩阵 Jacobian matrix
运动学和动力学:在机器人学中,雅可比矩阵用于描述机器人末端执行器的速度与关节速度之间的关系,是瞬时运动学的重要组成部分。通过雅可比矩阵,可以计算末端执行器的线速度和角速度,以及在逆运动学中反算关节的变化。坐标变换:雅可比矩阵的行列式在坐标变换中非常重要,它表示变换后的空间与原空间的面积(二维)、体积(三维)等的比例,也称为缩放因子。在多重积分中,雅可比行列式用于将一个坐标系下的积分转换到另一个坐标系下。最优化问题:在最优化问题中,雅可比矩阵可以用于牛顿法求解,帮助确定多元函数的极值问题。
2025-05-15 10:26:56
435
原创 17、梯度的基础含义
梯度是一个多变量函数在某一点处的方向导数沿着该方向取得最大值的向量,其大小表示函数在该方向上的变化率。梯度向量的方向是函数增长最快的方向,其大小(或长度)等于该方向上的方向导数的值。其中,( u ) 是单位向量,表示导数的方向,( Δf(x) ) 是函数 ( f ) 在点 ( x ) 的梯度。梯度向量指向函数值增加最快的方向,因此,沿着梯度的反方向移动可以找到函数的局部最小值,这是梯度下降法的基础。梯度的概念是理解和应用多变量函数的核心工具,它在科学和工程的许多领域中都有广泛的应用。
2025-05-15 10:19:44
301
原创 16、矩阵增广
行简化:通过行操作(如交换行、将一行乘以非零标量、将一行加到另一行上),增广矩阵可以被转换为行阶梯形或简化行阶梯形,这有助于找到线性方程组的解。高斯-诺尔方法:增广矩阵是应用高斯-诺尔方法(Gaussian Elimination)的基础,这是一种系统地解线性方程组的方法。其中,( aij ) 是原始线性方程组中第 ( i ) 个方程的系数,( bi ) 是第 ( i ) 个方程的常数项。解线性方程组:增广矩阵的行阶梯形或简化行阶梯形可以用来确定线性方程组的解,包括唯一解、无穷多解或无解的情况。
2025-05-15 10:10:48
592
原创 15、矩阵的秩
矩阵的秩可以通过以下两种方式定义:行秩:矩阵的行秩是矩阵中行向量的最大线性无关组中向量的个数。列秩:矩阵的列秩是矩阵中列向量的最大线性无关组中向量的个数。对于任意矩阵,其行秩和列秩是相等的,这个共同的值就是矩阵的秩,记作 rank(A) 或 r(A)。
2025-05-15 09:57:13
411
原创 14、矩阵初等行变换与初等列变换
初等行变换和初等列变换虽然在数学上是对称的,但它们在实际应用中可能会根据问题的性质和需求选择使用其中之一。初等行变换(Row Echelon Transformations)和初等列变换(Column Echelon Transformations)在解决实际问题中的应用主要体现在它们处理问题的方式和侧重点上。初等行变换可以用来求矩阵的秩,即通过行变换将矩阵转换为行阶梯形,秩的过程就是将矩阵转换为行阶梯形的过程。初等行变换和初等列变换都是高斯-诺尔方法的一部分,用于将矩阵转换为更简单的形式。
2025-05-15 09:43:07
641
原创 13、矩阵特征值与特征向量的意义
如果一个矩阵可以对角化,这意味着存在一个由特征向量组成的基,使得在这个基下,矩阵的表示是一个对角矩阵。通过特征向量和特征值,复杂的几何变换(如拉伸、压缩、旋转)可以被分解为一系列简单的变换,每个变换只在一个特定的方向上作用。特征向量定义的子空间在变换下是不变的,这意味着任何在这个子空间中的向量在变换后仍然留在这个子空间中。通过选择不同的特征向量作为基,可以改变坐标系,使得在新坐标系中矩阵的表示更简单,例如对角矩阵。特征值的几何重数是其对应特征空间的维数,即与该特征值相关联的线性独立特征向量的数量。
2025-05-15 09:33:00
1023
原创 12、矩阵特征值与特征向量
如果一个矩阵有一组完整的线性独立的特征向量,那么这个矩阵可以被对角化,即存在一个对角矩阵 ( D ) 和一个可逆矩阵 ( P )(其列是特征向量),使得 ()。对于每个特征值 ( λ ),将 ( λ ) 代入 ( A - λI ) 并求解线性方程组 ( (A - λI)v = 0 ) 来找到对应的特征向量。那么,( v ) 被称为 ( A ) 的一个特征向量(eigenvector),而 ( λ ) 被称为对应的特征值(eigenvalue)。对于对称矩阵,不同特征值对应的特征向量是正交的。
2025-05-14 18:03:45
382
原创 11、C++ 计算两个向量Yaw的夹角
std::atan2(y, x) :是一个计算反正切的函数,它根据两个参数 y 和 x 的符号来确定角度所在的象限。这里使用 atan2 的目的是根据 sin_theta 和 cos_theta 的符号,直接计算出夹角的大小和方向。atan2 的返回值范围是 [-π, π],即 [-180°, 180°],这正是我们需要的结果。总结:std::atan2(sin_theta, cos_theta) 是通过正弦和余弦值来计算夹角的大小和方向。sin_theta 是两个向量的叉积,用于确定夹角的方向。
2025-05-14 17:53:02
418
原创 10、C++ 判断点是否在旋转矩形内部
假设旋转矩形由四个顶点 A(x1, y1),B(x2, y2),C(x3, y3),和 D(x4, y4) 定义。设要判断的点为 P(x, y)。
2025-05-14 17:42:21
749
原创 9、C++ 外部的一点到四边形的最短距离
确定点和四边形的坐标:设点为 ( P = (x0, y0) ),四边形的顶点为 (A = (x1, y1)),(B = (x2, y2)),(C = (x3, y3)) 和 (D = (x4, y4))。通过检查 ( t ) 的值,我们可以确定点 ( P ) 的投影位置是否在线段 ( AB ) 上,从而计算出点到线段的最短距离。因此,无论是逆时针顺序还是顺时针顺序,只要四边形的顶点按照顺序连接形成四边形的边界,计算点到四边形的最短距离的方法都是相同的。C++ 判断点是否在旋转矩形内部。
2025-05-14 17:31:15
447
原创 8、向量的叉乘在二维平面中的含义
在二维平面上,叉积可以简化为一个标量,表示两个向量的旋转方向。如果叉积为正,表示从第一个向量到第二个向量是逆时针旋转;如果叉积为负,则是顺时针旋转;如果叉积为零,表示两个向量方向相同或相反。在二维平面上,向量的叉乘(叉积)可以简化为一个标量值,这个标量值表示两个向量所构成的平行四边形的面积,并且其符号可以用来判断两个向量的旋转方向。
2025-05-14 17:16:51
162
原创 7、向量的叉乘 Cross Product
三维向量叉乘运算的结果还是一个向量,具有大小和方向。向量叉乘的意义:(1)方向为两向量的组成平面的法向量方向, (2)大小为两向量组成的平行四边形的面积。外积的方向垂直于这两个向量,大小为|a||b|sinθ,是这两个向量张成的四边形的有向面积。对于外积,我们引入了反对称符号,把a写成一个矩阵。a事实上是一个反对称矩阵skew-symmetric。这样就把外积a×b写成了矩阵与向量的乘法ab。外积只对三维向量存在定义,外积还可以表示向量的旋转。为什么外积可以表示旋转?
2025-05-14 17:12:23
1032
原创 6、向量的点乘 Dot Product
向量的点乘,也称为内积或数量积,是两种向量之间的一种运算,它在任意维度的空间中都定义。点乘的结果是两个向量的大小与它们之间夹角的余弦值的乘积,是一个标量值。向量的点乘(内积或数量积)具有深刻的几何意义,主要体现在以下几个方面:点乘可以用来判断两个向量是否平行(同向或反向)。如果两个向量的点乘结果为正,它们之间的夹角是锐角或零度,表示它们大致指向同一方向;如果结果为负,表示它们之间的夹角是钝角,大致指向相反方向;如果结果为零,表示它们垂直。一个向量与其自身的点乘等于其大小的平方,即 (a·a = |a|^
2025-05-13 13:58:16
289
原创 5、向量与矩阵
向量是具有大小(长度)和方向的量,可以被看作是欧几里得空间中的点或者从一个点指向另一个点的箭头。线性方程组可以用矩阵形式表示,其中系数构成矩阵,变量构成列向量,常数构成另一个列向量。矩阵的特征值和特征向量是研究矩阵性质的重要工具,特征向量是与特征值相关联的非零向量。矩阵可以是方阵(行数和列数相等)、高矩阵(列数多于行数)、宽矩阵(行数多于列数)。矩阵与向量的乘法可以看作是线性变换,它将向量映射到同一空间中的另一个向量。矩阵乘法:第一个矩阵的行与第二个矩阵的列的点积。向量可以看作是只有一行或一列的矩阵。
2025-05-13 13:46:55
402
原创 4、坐标与向量
例如,在三维空间中,向量 (v) 可以表示为 (v = (vx, vy, vz)),其中 (vx)、(vy) 和 (vz) 分别是向量在x、y、z轴上的分量。向量是一个既有大小(长度)又有方向的量,它可以用于表示点的位置(位置向量)、速度、加速度、力等物理量。点积和叉积:两个向量的点积和叉积可以通过它们的坐标分量来计算,这些运算在物理学中非常有用,例如在计算力所做的功或力矩时。几何表示:向量可以被看作是从空间中的一个点指向另一个点的箭头,箭头的长度表示向量的大小,箭头的方向表示向量的方向。
2025-05-13 13:32:14
370
原创 3、正态分布 / 高斯分布
正态分布(Normal Distribution)和高斯分布(Gaussian Distribution)实际上是同一个概率分布的不同叫法。它们指的是同一种连续概率分布,这种分布在自然科学和社会科学的许多领域中都非常常见,因其钟形曲线而得名“钟形曲线”。正态分布的概率密度函数(Probability Density Function, PDF)由下式给出:对称性:正态分布关于其均值 ( μ ) 对称,即均值、中位数和众数相同:在正态分布中,均值、中位数和众数都重合于 ( μ )。68-95-99.7 规则
2025-05-13 11:51:30
2231
原创 2、C++ dynamic mean covariance 动态均值和协方差
这个 DynamicMeanCovariance 类中的 addPoint 函数是动态更新均值和协方差的核心部分,可以根据需要调用它来不断更新均值和协方差。协方差的动态更新:对于协方差的动态更新,一般会基于历史协方差和新数据来进行更新。这段代码使用了 Eigen 库来处理矩阵运算,并且通过类的封装提供了动态更新均值和协方差的接口。均值的动态更新:对于均值的动态更新,常用的方法是使用加权平均。这些公式是基于加权平均的思想和协方差的定义,结合历史数据和新数据来动态更新均值和协方差。
2025-05-13 11:35:06
412
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人