SFM原理简介

article/2025/10/15 21:16:07

Structure From Motion

SFM简介

通过相机的移动来确定目标的空间和几何关系,是三维重建的一种常见方法。
它与Kinect这种3D摄像头最大的不同在于,它只需要普通的RGB摄像头即可,因此成本更低廉,且受环境约束较小,
在室内和室外均能使用。

SFM基本原理

  • 小孔相机模型

    在计算机视觉中,最常用的相机模型就是小孔成像模型,它将相机的透镜组简化为一个小孔,光线透过小孔在小孔后方的像面上成像。

    小孔成像
    小孔模型成的是倒像,为了表述与研究的方便,我们常常将像面至于小孔之前,且到小孔的距离仍然是焦距f,这样的模型与原来的小孔模型是等价的,只不过成的是正像,符合人的直观感受。
    在这种情况下,往往将小孔称作光心(Optical Center)。

    小孔成像

  • 坐标系

    • 世界坐标系

      世界坐标系的原点可以任意选择,与相机的具体位置无关。

    • 摄像机坐标系

      相机坐标系以相机的光心(小孔)作为原点,X轴为水平方向,Y轴为竖直方向,Z轴指向相机所观察的方向。

    • 图像物理坐标系

      其原点为透镜光轴与成像平面的交点,x与y轴分别平行于摄像机坐标系的X与Y轴,是平面直角坐标系,单位为毫米。

    • 图像像素坐标系

      固定在图像上的以像素为单位的平面直角坐标系,其原点位于图像左上角,x与y轴平行于图像物理坐标系的X 和Y轴。对于数字图像,分别为行列方向。

  • 摄像机内参矩阵

    设空间中有一点P,若世界坐标系与相机坐标系重合,则该点在空间中的坐标为(X, Y, Z),
    其中Z为该点到相机光心的垂直距离。设该点在像面上的像为点p,像素坐标为(x, y),如下图所示。

    三角关系图

    根据相似三角形关系可以得到 x = f X Z x=\frac{fX}{Z} x=ZfX y = f Y Z y=\frac{fY}{Z} y=ZfY

    图像的像素坐标系原点在左上角,而上面公式假定原点在图像中心,为了处理这一偏移,设光心在图像上对应的像素坐标为 ( c x , c y ) (c_x,c_y) (cx,cy),因此 x = f X Z + c x x=\frac{fX}{Z}+c_x x=ZfX+cx y = f Y Z + c y y=\frac{fY}{Z}+c_y y=ZfY+cy
    矩阵形式
    Z [ x y 1 ] = [ f 0 c x 0 f c y 0 0 1 ] [ X Y Z ] Z\begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} = \begin{bmatrix} f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} X \\ Y \\ Z \\ \end{bmatrix} Zxy1=f000f0cxcy1XYZ
    其中K为内参矩阵,它只和相机自身的内部参数有关(焦距,光心位置)。
    K = [ f 0 c x 0 f c y 0 0 1 ] K=\begin{bmatrix} f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1 \end{bmatrix} K=f000f0cxcy1

  • 摄像机的外参矩阵

    一般情况下,世界坐标系和相机坐标系不重合,这时,世界坐标系中的某一点P要投影到像面上时,先要将该点的坐标转换到相机坐标系下。设P在世界坐标系中的坐标为X,P到光心的垂直距离为s(即上文中的Z),在像面上的坐标为x,世界坐标系与相机坐标系之间的相对旋转为矩阵R(R是一个3行3列的旋转矩阵),相对位移为向量T(3行1列),则
    s x = K [ R X + T ] sx=K\begin{bmatrix} RX + T \end{bmatrix} sx=K[RX+T]
    其中RX+T 即为P在相机坐标系下的坐标,使用齐次坐标改写上式为
    s x = K [ R T ] [ X 1 ] sx = K\begin{bmatrix} R & T \end{bmatrix}\begin{bmatrix} X \\ 1 \end{bmatrix} sx=K[RT][X1]
    其中 [ R T ] \begin{bmatrix} R & T\end{bmatrix} [RT]是一个3行4列的矩阵,称为外参矩阵,它和相机的参数无关,只与相机在世界坐标系中的位置有关。

  • 摄像机标定

    相机的标定,即为通过某个已知的目标,求取相机内参矩阵的过程。

  • 极线约束与本征矩阵

    假设在世界坐标系中有一点p,坐标为X,它在1相机中的像为 x 1 x_1 x1,在2相机中的像为 x 2 x_2 x2(注意 x 1 x_1 x1 x 2 x_2 x2为齐次坐标,最后一个元素是1),如下图所示。
    两个相机之间的关系图
    设X到两个相机像面的垂直距离分别为 s 1 s_1 s1 s 2 s_2 s2,且这两个相机具有相同的内参矩阵K,与世界坐标系之间的变换关系分别为 [ R 1 T 1 ] \begin{bmatrix} R_1 & T_1 \end{bmatrix} [R1T1] [ R 1 T 1 ] \begin{bmatrix} R_1 & T_1 \end{bmatrix} [R1T1],那么我们可以得到下面两个等式
    x 1 s 1 = K ( R 1 X + T 1 ) x 2 s 2 = K ( R 2 X + T 2 ) \begin{matrix} x_1s_1 = K(R_1X + T_1) \\ x_2s_2 = K(R_2X + T_2) \end{matrix} x1s1=K(R1X+T1)x2s2=K(R2X+T2)
    K是可逆矩阵,则
    K − 1 x 1 s 1 = R 1 X + T 1 K − 1 x 2 s 2 = R 2 X + T 2 \begin{matrix} K^{-1}x_1s_1 = R_1X + T_1 \\ K^{-1}x_2s_2 = R_2X + T_2 \end{matrix} K1x1s1=R1X+T1K1x2s2=R2X+T2
    K − 1 x 1 = x 1 , , K − 1 x 2 = x 2 , K^{−1}x_1 = x_1^,,K^{−1}x_2 = x_2^, K1x1=x1,K1x2=x2,,则有
    x 1 , s 1 = R 1 X + T 1 x 2 , s 2 = R 2 X + T 2 \begin{matrix} x_1^,s_1 = R_1X + T_1 \\ x_2^,s_2 = R_2X + T_2 \end{matrix} x1,s1=R1X+T1x2,s2=R2X+T2
    我们一般称 x 1 , x_1^, x1, x 2 , x_2^, x2,为归一化后的像坐标,它们和图像的大小没有关系,且原点位于图像中心。我们将世界坐标系选为第一个相机的相机坐标系,则 R 1 = I , T 1 = 0 R_1 = I, T_1 = 0 R1=I,T1=0。上式变为
    x 1 , s 1 = X x 2 , s 2 = R 2 X + T 2 x_1^,s_1 = X \\ x_2^,s_2 = R_2X + T_2 x1,s1=Xx2,s2=R2X+T2
    将式一带入式二,则
    s 2 x 2 , = s 1 R 2 x 1 , + T 2 s_2x_2^, = s_1R_2x_1^, + T_2 s2x2,=s1R2x1,+T2
    x 2 , x_2^, x2, T 2 T_2 T2都是三维向量,它们做叉积之后得到另外一个三维向量 T 2 ^ x 2 , \hat{T_2}x_2^, T2^x2,(其中 T 2 ^ \hat{T_2} T2^为叉积的矩阵形式, T 2 ^ x 2 , \hat{T_2}x_2^, T2^x2,代表 T 2 ^ × x 2 , \hat{T_2}×x_2^, T2^×x2,),且该向量垂直于 x 2 , x_2^, x2, T 2 T_2 T2,再用该向量对等式两边做点积,则
    0 = s 1 ( T 2 ^ x 2 , ) T R 2 x 1 , ⇒ x 2 , T 2 ^ R 2 x 1 , = 0 0 = s_1(\hat{T_2}x_2^,)^TR_2x_1^, \\ \Rightarrow x_2^,\hat{T_2}R_2x_1^, = 0 0=s1(T2^x2,)TR2x1,x2,T2^R2x1,=0
    E = T 2 ^ R 2 E=\hat{T_2}R_2 E=T2^R2,则
    x 2 , E x 1 , = 0 ⇒ x 2 T K − T S t 2 R 2 K − 1 x 1 = 0 其 中 F = K − T S t 2 R 2 K − 1 x_2^,Ex_1^, = 0 \\ \Rightarrow x_2^TK^{-T}S_{t2}R_2K^{-1}x_1 = 0 \\ 其中 F = K^{-T}S_{t2}R_2K^{-1} x2,Ex1,=0x2TKTSt2R2K1x1=0F=KTSt2R2K1
    这里 S t 2 S_{t2} St2为反对称矩阵
    S t 2 = [ 0 − t 3 t 2 t 3 0 − t 1 − t 2 t 1 0 ] S_{t2}=\begin{bmatrix} 0 & -t_3 & t_2 \\ t_3 & 0 & -t_1 \\ -t_2 & t_1 & 0 \end{bmatrix} St2=0t3t2t30t1t2t10
    上式是同一点在两个相机中的像所满足的关系,它和点的空间坐标、点到相机的距离均没有关系,我们称之为极线约束(外极约束)。而矩阵E则称为关于这两个相机的本质矩阵(基础矩阵F)。如果我们知道两幅图像中的多个对应点(至少5对),则可以通过上式解出矩阵E,又由于F是由 T 2 T_2 T2 R 2 R_2 R2构成的,可以从F中分解出 T 2 T_2 T2 R 2 R_2 R2。由于det(F)=0,所以基础矩阵的秩小于等于2,在估计F的算法中会用到这些性质。

SFM算法流程

  • 特征点提取与特征点匹配

    • 特征点提取

      • Shi&Tomasi
      • SIFT
      • SURF
    • 特征点匹配

      • 描述子计算

        匹配结果往往有很多误匹配,为了排除这些错误,使用KNN算法寻找与该特征最匹配的2个特征,若第一个特征的匹配距离与第二个特征的匹配距离之比小于某一阈值,就接受该匹配,否则视为误匹配。当然,也可以使用交叉验证方法来排除错误。

  • 基础矩阵估计F

    基础矩阵中有9 个元素

    • 5点法

    • 8点法

      • 采用了RANSAC的方法进行对E进行估计,每一步迭代的过程中,利用8点法进行求解。
  • 本质矩阵估计E

    本征矩阵有7个独立参数
    估计出本质矩阵的目的是为了对之前求得的匹配进行约束,得到的匹配成为几何一致匹配,不同图像上的几何一致匹配形成了一个TRACK(其实就是一个空间点在不同的图像上的投影点之间的匹配)。

  • 本质矩阵分解为R和T

    • SVD分解

    • 存在4种可能的解,寻找正确的解

    • 检查旋转矩阵R的正确性

      R的行列式必须为1或者-1

  • 三维点云计算

    • 三角形法

      已经知道了两个相机之间的变换矩阵(R和T),还有每一对匹配点的坐标,通过这些已知信息还原匹配点在空间当中的坐标,根据公式
      x 2 s 2 = K ( R 2 X + T 2 ) x_2s_2 = K(R_2X + T_2) x2s2=K(R2X+T2)
      这个等式中有两个未知量,分别是 s 2 , x s_2, x s2,x。用 s 2 s_2 s2对等式两边做叉积,可以消去 s 2 s_2 s2,得
      0 = x 2 ^ K ( R 2 X + T 2 ) ⇒ x 2 ^ K R 2 X = − x 2 ^ K T 2 ⇒ x 2 ^ K ( R 2 T 2 ) ( X 1 ) = 0 0 = \hat{x_2}K(R_2X + T_2) \\ \Rightarrow \hat{x_2}KR_2X = -\hat{x_2}KT_2 \\ \Rightarrow \hat{x_2}K\begin{pmatrix} R_2 & T_2 \end{pmatrix}\begin{pmatrix} X \\ 1 \end{pmatrix} = 0 0=x2^K(R2X+T2)x2^KR2X=x2^KT2x2^K(R2T2)(X1)=0
      用SVD求X左边矩阵的零空间,再将最后一个元素归一化到1,即可求得X。其几何意义相当于分别从两个相机的光心作过x1和x2的延长线,延长线的焦点即为方程的解,如文章最上方的图所示。

  • 重投影

    将三维点三角化并重映射到摄像机得到二维点,计算与最初二维点之间的距离,说明三角化误差。

  • 计算第三个摄像机到到世界坐标系的变换矩阵(R和T)

    • 假设:用于多目重建的图像是有序的,即相邻图像的拍摄位置也是相邻的。

    • 猜想:

      • 最简单的想法,就是沿用双目重建的方法,即在第三幅图像和第一幅图像之间提取特征点,然后估计本征矩阵E。那么加入第四幅、第五幅,乃至更多呢?随着图像数量的增加,新加入的图像与第一幅图像的差异可能越来越大,特征点的提取变得异常困难,这时就不能再沿用双目重建的方法了。
      • 用新加入的图像和相邻图像进行特征匹配,然后计算E,但这是计算的是相对变换,比如相机三到相机二的变换,而我们需要的是相机三到相机一的变换。有人说,既然知道相机二到相机一的变换,又知道相机到三到相机二的变换,不就能求出相机三到相机一的变换吗?实际上,通过这种方式,你只能求出相机三到相机一的旋转变换(旋转矩阵R),而他们之间的位移向量T,是无法求出的。这是因为上面两个函数求出的位移向量,都是单位向量,丢失了相机之间位移的比例关系。
    • 算法描述:

      • 摄像机标定或摄像机之态估计,对于输入的第三幅图片,计算第三幅图片与第二幅图片的匹配点,这些匹配点中,肯定有一部分也是图像二与图像一之间的匹配点,也就是说,这些匹配点中有一部分的空间坐标是已知的,同时又知道这些点在第三幅图像中的像素坐标,即可计算变换矩阵。

        • 透视N点法(PNP)
      • 三角化更多的点并查看这些点是如何融入存在的几何结构中,然后进行求解。

        • 迭代最近点法(ICP)
  • 更多摄像相机的变换矩阵计算

    得到第三个摄像机的变换矩阵后,就可以计算匹配点的在空间中的坐标,得到三维点云,将新得到的三维点云与之前计算得三维点云进行融合(已经存在的空间点,就没必要再添加了,只添加在图像二和三之间匹配,但在图像一和图像三中没有匹配的点)。然后循环迭代,如下图所示。
    算法迭代流程

  • 重构的细化与优化

    • 原因:随着图像的不断增加,误差会不断累积,最后误差过大以至于完全偏离重建的目标。

    • 目的:三维点云的位置和摄像机的位置优化

    • 算法:

      • 光束法平差(Bundle Adjustment)

        BA本质上是一个非线性优化算法

        • 简单稀疏光束调整(SSBA)
      • Ceres Solver

        Google的一个开源项目,用来求解非线性最小二次问题的库,因此可以用来求解BA。
        Ceres Solver专为求解此类问题进行了大量的优化,有很高的效率,尤其在大规模问题上,其优势更加明显。

OpenCV3中的SFM

主要包括两种重建的接口cv::sfm::reconstruct,一种是输入图像序列,一种是输入跟踪点序列,计算出相机在两帧空间场景间的R和T,算法具体实现基于libmv库。
  • libmv

     libmv是Blender旗下的一个开源项目。libmv是一个通过运动计算结构的库。 
    

http://chatgpt.dhexx.cn/article/682T9RbJ.shtml

相关文章

SFM(Structure from Motion)一点总结

SFM(Structure from Motion)一点总结 运动结构恢复(Structure from motion)数十年来一直是计算机视觉领域的热门研究方向之一,实现了众多实际应用,尤其在近景三维重建中,该算法从获取的目标物系列影像出发&#xff0c…

sfm从运动到结构

sfm,即structure from motion。从一堆同一场景的照片中恢复场景的三维结构和照片拍摄时相机的位置,可分为全局sfm和增量式sfm。 全局sfm主要包括以下步骤: 1.提取各张照片上的特征点及其描述; 2.对所有照片相互进行特征点匹配&a…

猿创征文|SfM(Structure from Motion)学习之路

文章目录 0 前言1 理论基础1.1 书籍推荐1.2 SfM概述 2 动手实践2.1 增量式SfM复现总结2.2 部分复现结果2.3 遇到问题与解决 3 后续学习3.1 前沿论文阅读笔记3.2 Colmap使用问题3.3 三维旋转3.4 场景对齐 0 前言 一转眼,研究生生活已经过去两年了。开始接触SfM也是两…

SFM综述

Structure from Motion(SfM)是一个估计相机参数及三维点位置的问题。SfM方法可以分为增量式(incremental/sequential),全局式(global),混合式(hybrid),层次式&#xff08…

计算机视觉之三维重建-SFM系统

SFM系统 1.PnP问题2. RANSAC拟合3.本质矩阵与单应矩阵4.sift特征提取*2视图欧式结构恢复求解流程*openMVG系统Tracks联通图计算流程 北邮三维重建课笔记 1.PnP问题 PnP问题:就是利用其中两个相机算出三维点坐标,再利用三维点坐标和第三个相机的像平面坐标…

java中浮点数表示方式

java虚拟机中的浮点数分为float和double两种,分别为32位和64位.它参考了IEEE 754的规范对浮点数进行处理。下面以float为例 ,分析一下float数的表示方法. float的32位分成三个部分来表示一个浮点数: 浮点数的取值计算公式为: 解析: 1) 当…

一文读懂 IEEE754 浮点数的表示方法

FBI WARNING:鄙人首个开源电子书 《Go 编码建议》已经上线啦,欢迎各位大佬斧正指导,协同共建。 文章目录 1.浮点数的存储格式2.移码3.浮点数的规格化3.1 单精度浮点数真值3.2 双精度浮点数真值 4.浮点数的具体表示4.1 十进制到机器码4.2 机器…

浮点数表示(IEEE 754)

引入 N S r j N Sr^j NSrj N:浮点数S:尾数r:基数j:阶码 举个例子: 123.456 1.23456 1 0 2 123.456 1.2345610^{2} 123.4561.23456102 其中123.456是浮点数,1.23456是尾数,10是基数(10进…

c++ 浮点数表示

1.为何称为浮点数 对于一个浮点数来说,其通常可以科学计数法来表示,而对于一个浮点数来说,由于次方可变,故小数点可以左右移动。 eg:-36.5 ,及可以表示为:,也可以表示为&#xff0…

Java中浮点数的表示方法

Java中浮点数的表示方法 Java中浮点数的表示方法 1.计算机中的表示方法2.具体分析表示方法 小结 3.移位存储 小结 1.计算机中的表示方法 对于float来说,4个字节,32位,0-22位表示尾数,23-30(8位)表示指数,31位表示符…

浮点数的表示

科学计数法 浮点数的表示 阶码E反映表示范围及小数点的实际位置 位数M的数值部分的位数n反映浮点数的精度 浮点数尾数的规格化 左移三位 0.110;1.0100000 表示范围 浮点数标准 IEEE 754 移码 阶码真值移码-偏移量

dsp处理浮点数_DSP中浮点数的表示方法

DSP中浮点数的表示方法 tongxin | 2009-03-20 15:16:17 阅读:2484 发布文章 先介绍一下IEEE754中浮点数的定义(这里只介绍单精度浮点数): %A %A 单精度浮点数由4字节(32位)组成,且分成3段:数符s(0表示正数,1表示负数…

C语言浮点数的各种表示方法

2022.8.7更新 学习js的过程中发现了0.10.2更深一层的运算过程,感兴趣的可以看看这个博主写的帖子。 JavaScript 浮点数之迷:0.1 0.2 为什么不等于 0.3? ​​​​​​​ 前提: 由于存在精度限制,浮点数只是⼀个近似值&…

浮点数的表示方法是什么?

是已知的C/C编译器都是按照IEEE(国际电子电器工程师协会)制定的IEEE浮点数表示法来进行运算的。这种结构是一种科学表示法,用符号(或-)、指数和尾数来表示,底数被确定为2。所以在IEEE浮点数表示法里&#x…

浮点数表示总结

浮点数 早期的计算机使用定点数来表示实数,由于定点数的小数点位置固定,而计算机字长有限,定点数无法表示很大和很小的实数,因此而在计算机科学中有了对于实数近似值数值的表示法——浮点数。这种表示法类似于十进制中的科学计数…

计算机中浮点数表示

浮点数表示 浮点数在计算机中由符号位、指数和尾数组合而成。 通常,浮点数表示为如下形式: F为小数(尾数)字段值,E为指数字段值。 溢出(浮点的上溢):正的指数太大而超过了指数字段的表示范围。 下溢:负的指数太大而…

计算机组成原理浮点数表示

浮点数表示 浮点数的表示分为阶码和尾数; 比如3.026*1011;阶码是11;尾数是3.026; 对于阶码: 阶符为正,小数点向后移n位(n表示阶的大小); 阶符为负,小数点向前移n位(n表示阶的大小&a…

初步了解机器中浮点数表示方法

浮点数是小数点位置变化的数,能表示的范围比定点数大很多。 比如二进制数11.11可以表示为111.12-1或1.11121等,我们由此规律能得到二进制数更一般形式N2EF,E称为阶码,F称为尾数。这个数在机器里怎么存呢,是把正负符号…

32位浮点数表示方法

今天开始给大家介绍计算机组成原理课程,本文主要内容是32位浮点数表示方法。 一、32位浮点数构成 32位浮点数是计算机中常见的一种数据类型,该数占据32bit空间,可以表示较大范围内的整数和小数。32位浮点数由三部分组成,分别是符…

浮点的表示方法

浮点表示方法 一、浮点的表示方法一、单精度类型(float)二、双精度类型(double)三、IEEE 754标准 单精度名称本身的含义是“单字长精确的程度”。跟什么32位、64位有没有关系, 取决于系统支持的字长(word)是几个字节(…