SFM运动恢复结构重建

一、SFM是什么

通过相机的移动来确定目标的空间和几何关系,是三维重建的一种常见方法。

1.相机内参矩阵

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

请添加图片描述
根据相似三角形关系可以得到 x ′ = f X / Z x'=fX/Z x=fX/Z y ′ = f Y / Z y'=fY/Z y=fY/Z
图像的像素坐标系原点在左上角,而上面公式假定原点在图像中心,为了处理这一偏移,设光心在图像上对应的像素坐标为( cx , cy) (cx,cy)。因此, x = f X / Z + c x x=fX/Z+c_x x=fX/Z+cx y = f Y / Z + c y y=fY/Z+c_y y=fY/Z+cy
在这里插入图片描述

2.相机外参矩阵

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

和这里的红色一致: 内外参

二、SFM流程

1.特征点提取与特征点匹配

特征点提取与特征点匹配
特征点匹配:描述子计算

2.欧式结构恢复(内参已知,外参未知)

欧式结构恢复问题:
已知:
1、n个三维点在m张图像中的对应点的像素坐标
2、相机内参
求解:
1、n个三维点坐标
2、m个摄像机的外参数R、T

3. 对极几何

1)基础矩阵,本质矩阵

极几何描述了同一场景或者物体的两个视点图像间的几何关系
请添加图片描述
基础矩阵具有以下几种性质:
请添加图片描述
请添加图片描述
请添加图片描述请添加图片描述
如果采集到的对应点在同一平面,用8点法求基础矩阵时,列出的方程组是线性相关,无法求解。因此,如果采集到的对应点在同一平面,两个视点间的对应关系用单应性矩阵表示。在实际使用中,并不知道匹配的对应点是否同一平面。一般情况下,基础矩阵和单应性矩阵都会求,看谁的重投影误差小。
请添加图片描述
请添加图片描述

2)8点法求解基础矩阵F

请添加图片描述

请添加图片描述

方程的最小二乘解有一个既定的结论,即对A进行SVD分解,得到的VT的最后一行即是f的解。

所以对W进行SVD分解求得f。
f f f重组为 F ^ \hat{F} F^。求出的 F ^ \hat{F} F^往往是满秩的,而我们所要求的基础矩阵秩为2。因此最佳解为秩为2的 F ^ \hat{F} F^近似的条件为红色框:
并将 F ^ \hat{F} F^SVD分解,用于得到F:
请添加图片描述

RANSAC求解基础矩阵
RANSAC算法的基本思想是通过随机采样一小部分数据来估计模型参数,然后用这个模型对所有数据进行测试,将满足模型的数据点作为内点,不满足模型的数据点作为外点。通过迭代的方式不断随机采样和估计模型参数,最终得到内点数目最多的模型作为最终的估计结果。
请添加图片描述
请添加图片描述
在 OpenCV中,提供findFundamentalMat函数,用于估计两幅图像之间的F矩阵:
在这里插入图片描述

F, mask = cv2.findFundamentalMat(pixel_points1, pixel_points2, method=cv2.FM_RANSAC,ransacReprojThreshold=0.9, confidence=0.99)

findFundamentalMat函数原型详见

3)SVD求解本质矩阵E

在这里插入图片描述

  1. 直接求,K为相机内参
E = K.T.dot(F).dot(K)
  1. opencv的RANSAC可以直接分解得到E,提供findFundamentalMat函数
//p1,p2是匹配好的关键点
    focal_length = 0.5 * (K[0, 0] + K[1, 1])
    principle_point = (K[0, 2], K[1, 2])
//参数mask输出N个元素的数组,其中每个元素对于异常值设置为0,对其他点设置为1。
    E,mask = cv2.findEssentialMat(p1, p2, focal_length, principle_point, cv2.RANSAC, 0.999, 1.0)
    cameraMatrix = np.array([[focal_length, 0, principle_point[0]], [0, focal_length, principle_point[1]], [0, 0, 1]])

4. 求解R,t

请添加图片描述

pass_count, R, T, mask = cv2.recoverPose(E, p1, p2, cameraMatrix, mask)

5. 三角测量

三角测量:已知相机内外参数和同一个三维点对应多个视角像平面上的同名点坐标,恢复三维点的坐标
请添加图片描述
在这里插入图片描述
在这里插入图片描述
叉乘后右侧为0
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6. 捆绑调整,光束平差法(Bundle Adjustment, BA)

捆绑调整:同时对三维点坐标和相机参数进行非线性优化,优化的目标是使得投影的点和观察点的误差越小越好

1)重投影

由前面可知,我们可以通过特征点检测与匹配,得到多对特征匹配点,使用对极几何可以求得相机的位姿。由下面公式可得,我们可以通过空间点P的坐标求得空间点P投影在图像中的像素坐标,但是这个像素点坐标是先通过位姿估计,再通过公式计算出来的,相当于这个像素坐标是估算出来的。这个过程称为重投影。
请添加图片描述

2)重投影误差

请添加图片描述如果完全没有误差,那么两者的坐标是一样的,但这是不可能的,不管是实际测量出来的像素坐标还是通过位姿估算+重投影计算出来的像素坐标,都是有误差的,将实际值和估算值一减,就得到了重投影误差。

3)最小化重投影误差

由于两张图片中有很多特征匹配点,将所有特征点重投影误差求和,取平方,再乘以1/2,这就构建了一个非线性最小二乘问题了,将里面的位姿、空间点作为优化的对象,最小化重投影误差,即得到一个优化后的结果,这就是所谓的BA。
请添加图片描述
在这里插入图片描述
在这里插入图片描述

最速下降法

在这里插入图片描述
在这里插入图片描述

牛顿法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Levenberg-Marquardt法

在这里插入图片描述
 A
在这里插入图片描述

—————————————————————————————————————
参考:
[1]: http://t.csdnimg.cn/nzrGx
[2]: http://t.csdnimg.cn/hNpz1
[3]: http://t.csdnimg.cn/MnWsj
[4]: http://t.csdnimg.cn/XWzjA
[5]: http://t.csdnimg.cn/Tw6o0
[6]: http://t.csdnimg.cn/9bSVn
[7]: https://visionary.blog.csdn.net/article/details/104108926?sharetype=blogdetail&sharerId=104108926&sharerefer=PC&sharesource=m0_68977737&sharefrom=from_link
[8]: https://blog.csdn.net/AAAA202012/article/details/116327648?sharetype=blogdetail&sharerId=116327648&sharerefer=PC&sharesource=m0_68977737&sharefrom=from_link

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值